如何检查字符串是否只有字母

Tom*_*y K 0 c++ string

我知道我可以通过以下方式检查“单词”是否都是字母:

bool checkAlpha(string str){
    bool retVal;
    for(int i = 0; i < str.size(); i++){
        if(isalpha(str[i]) == 0){

            retVal = true;
            cout << "Input must only contain letters\n";
            break;

        }
        else{

            retVal = false;
            cout << "all good\n";
        }
    }
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

由于我如何使用函数返回值,如果不是所有字母,我需要它返回 TRUE,如果不是所有字母,我需要它返回 FALSE。可能有一种更简单的方法可以做到这一点,但我刚刚开始使用 C++,所以这适合我当前的目的。

我的问题是如何检查字符串是否是多个“单词”?当它到达一个空格时,该函数(正确地)说该空格不是字母,并告诉我输入只能是字母。我尝试做

if((isalpha(str[i]) != 0) || (str[i] == " "))
Run Code Online (Sandbox Code Playgroud)

并将“if”更改为返回 false(仅输入字母和空格),将“else”更改为返回 true,但是当我尝试此操作时,出现编译器错误:

ISO C++ 禁止指针和整数之间的比较 [-fpermissive]

那么我该怎么做才能让用户输入的字符串只是字母或空格呢?(最好是最简单的方法)

Sla*_*ica 5

这个说法:

str[i] == " "
Run Code Online (Sandbox Code Playgroud)

不正确,应该是:

str[i] == ' '
Run Code Online (Sandbox Code Playgroud)

但更好

isspace( str[i] )
Run Code Online (Sandbox Code Playgroud)

因为您的条件不会检查其他符号,例如制表符等。

另外,你在逻辑上有中断,如果你遇到的不是 alpha 也不是 space,你可以将 retVal 设置为 true (并且也应该终止循环,因为你已经得到了答案),但你不能将其设置为 false 否则。所以你更正后的代码可能是:

bool checkAlpha(const string &str){
    bool retVal = false;
    for(int i = 0; i < str.size(); i++){
        if( !isalpha(str[i]) || !isspace(str[i]){
            retVal = true;
            cout << "Input must only contain letters\n";
            break;
        }
    }
    if( !retval )
       cout << "all good\n";
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

如果您不需要提供诊断消息,功能可以简单如下:

bool checkAlpha(const string &str){
    for(int i = 0; i < str.size(); i++)
        if( !isalpha(str[i]) || !isspace(str[i])
            return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

而且您的函数名称很混乱,根据返回值应该调用它checkNotAlpha