所以基本上我制作了一個程式,它從用戶那里獲取一些輸入并將其存盤在變數中。但問題是我希望用戶輸入核苷酸 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;
}
uj5u.com熱心網友回復:
正如 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;
}
主要看起來像這樣:
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::cins 錯誤狀態并使用回圈再次詢問用戶,以防他們輸入無效輸入。
完整示例:https : //godbolt.org/z/r4947G5sP
uj5u.com熱心網友回復:
您可以回圈使用 cin.get() 函式并檢查輸入字符
string GetStringFromConsole(){
string Returner;
while (true){
Returner = cin.get();
if (Returner[Returner.size() - 1] != 'A' &&
Returner[Returner.size() - 1] != 'T' &&
Returner[Returner.size() - 1] != 'G' &&
Returner[Returner.size() - 1] != 'C'){
cout << "Error";
Returner.resize(Returner.size() - 1);
continue;
}
if (Returner[Returner.size() - 1] == '\n'){
Returner.resize(Returner.size() - 1);
break;
}
}
return Returner;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/323629.html
上一篇:獲取下劃線前的字符
