2013-10-08 323 views
1

我试图获得一串运行在一起的字符,以便对一组“有效”字符进行解析。如果字符串全部是“有效”集合中的一个,则代码应该继续。如果字符串包含除有效集之外的任何字符,则应返回错误并提示重新输入,并再次检查其是否有效。将字符串与C++中的一组字符进行比较

我想出了两套不同的代码来执行检查,其中“guess”是输入字符串,A,a,B,b,C,c,D和d是允许的字符。第一组代码似乎第一次正确运行,然后接受任何内容,第二组代码在进入循环后只接受一个有效的字母输入。看过之后,似乎问题根植于逻辑陈述中。无论如何,任何援助将不胜感激。

代码#1:

int main(){ 
using namespace std; 
string guess; 

cout << "please enter your multiple choice answers: "; 
cin >> guess; 

bool nogood = true; 
int i = 0; 
while (nogood==true){ 
if (guess[i]== ('A'||'a'||'B'||'b'||'C'||'c'||'D'||'d')){ 
    i++; 
} 
else{ 
    cout << "That is not a valid choice please try again: "; 
    cin.clear(); 
    cin >> guess; 
    i=0; 
} 

if (i=guess.length()-1){ 
    nogood = false; 
} 
else{ 
    nogood = true; 
} 

} 
...code goes on 

代码#2:

int main(){ 
using namespace std; 
string guess; 

cout << "please enter your multiple choice answers: "; 
cin >> guess; 

for (int i =0; i < guess.length(); i++){ 
    if (guess[i] == ('A'||'a'||'B'||'b'||'C'||'c'||'D'||'d')){ 
    } 
    else{ 
     cout << "That is not a valid choice please try again: "; 
     cin.clear(); 
     cin >> guess; 
     i=0; 
    } 
} 
...code goes on 

回答

5

逻辑语句被分解,应该读

if (guess[i] == 'A' || guess[i] == 'a' || 
    guess[i] == 'B' || guess[i] == 'b' || 
    guess[i] == 'C' || guess[i] == 'c' || 
    guess[i] == 'D' || guess[i] == 'd')){ 
} 

否则编译器第一“计算”的单一值'A'||'a'||'B'||'b'||'C'||'c'||'D'||'d'(其等同于true)并比较guess[i]true这是这种情况下意味着true是转换为1

而且,在你的第一个代码示例使用

if (i=guess.length()-1) 

但这分配i,而不是比较吧。你需要==,而不是=

if (i==guess.length()-1) 

最后,可以简化使用std::string::find_first_not_of()整个测试

cout << "please enter your multiple choice answers: "; 
cin >> guess; 

while(guess.find_first_not_of("AaBbCcDd") != std::string::npos) { 
    cout << "That is not a valid choice please try again: "; 
    cin.clear(); 
    cin >> guess; 
} 
+0

非常感谢!奇迹般有效。 – user2856303

1

使用std::string::find_first_ofstd::strchr

const std::string validChars = "AaBbCcDd"; 
if (validChars.find_first_of(guess[i]) != std::string::npos) { 
    // whatever 
} 

或者:

if (std::strchr("AaBbCcDd", guess[i])) { 
    // whatever 
} 
相关问题