所以基本上我编写了一个程序,它从用户那里获取一些输入并将其存储在变量中。但问题是,我希望用户输入核苷酸DNA序列,因为DNA序列只由字母ATGC组成,我想限制输入,只包括这些字符,如果用户输入其他字符,它会显示一个错误
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string DNAsequence;
cout<<"Enter the DNA sequence : ";
cin>> DNAsequence;
cout<< "Your 5 to 3 DNA sequence is "<<DNAsequence;
}
正如Bathsheba在评论中提到的,这听起来像是在自定义>>
过载中处理的事情。
首先让我们定义一个类型,它包含一个字符串,并根据允许的字母参数化:
template <char ...allowed_chars>
struct DNASequence {
std::string value;
};
输出操作符很简单:
template <char ...allowed_chars>
std::ostream& operator<<(std::ostream& out,const DNASequence<allowed_chars...>& dna){
out << dna.value;
return out;
}
检查给定字母是否被允许的函数:
template <char ...allowed_chars>
bool check(char c){
auto eq = [](char a,char b){ return a==b;};
return (eq(c,allowed_chars) || ...);
}
现在输入操作符可以像往常一样读取字符串,然后检查字符串的每个字符:
template <char ...allowed_chars>
std::istream& operator>>(std::istream& in, DNASequence<allowed_chars...>& dna){
std::string temp;
in >> temp;
for (const auto& c : temp) {
if (! check<allowed_chars...>(c)){
in.setstate(std::ios::failbit);
return in;
}
}
dna.value = temp;
return in;
}
Main可以像这样:
int main ()
{
DNASequence<'A','C','G','T'> dna;
std::cout << "Enter the DNA sequence : ";
if (std::cin >> dna) {
std::cout << "Your 5 to 3 DNA sequence is " << dna;
} else {
std::cout << "invalid input";
}
}
我假设你想重置std::cin
的错误状态,并使用循环来再次询问用户,以防他们输入无效的输入。
完整示例:https://godbolt.org/z/r4947G5sP
您可以循环使用cin.get()函数并检查输入字符
string GetStringFromConsole(){
string Returner;
char ch=0;
while (ch = cin.get()){
switch (ch){
case 'A':
case 'T':
case 'G':
case 'C':
Returner += ch;
break;
case 'n':
case 'r':
break;
default:
cout << "Wrong input: " << ch << endl;
cin.ignore(cin.rdbuf()->in_avail());
Returner = "";
break;
}
if (ch == 'n' || ch == 'r')
break;
}
cout << Returner.data() << endl;
return Returner;
}