1

我正在尝试获取一串运行在一起的字符,以针对一组“有效”字符进行解析。如果字符串都是“有效”集合中的一个,则代码应该继续。但是,如果字符串包含除有效集合之外的任何字符,它应该返回错误并提示重新输入,再次检查其有效性。

我想出了两组不同的代码来执行检查,其中“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
4

2 回答 2

6

逻辑语句坏了,应该读

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()最后,您可以使用to简化整个测试

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;
}
于 2013-10-08T05:58:21.633 回答
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
}
于 2013-10-08T05:54:53.500 回答