我们怎么能 me 字符数组只接受 C++ 中的字母
how can we me character array accept only alphabets in c++
我只想在 c++ 的字符数组中输入字母。如果输入的所有字符都是字母,则必须返回 true,否则如果存在字母以外的任何字符,则返回 false。例如 有效输入:"abcdefGH"最多 20 个字符 无效输入:"abcD12hyK" 我尝试了以下方法,但没有得到所需的输出。请帮忙。
#include<iostream>
using namespace std;
bool isValidName(char myInput[]);
int main(){
char name[20];
cout<<"Enter Name: ";
cin.getline(name,20);
bool input = isValidName(name);
cout<<"Name : "<<input<<endl;
}
bool isValidName(char myInput[])
{
for(int i=0; i<20; i++)
{
if(!isalpha(myInput[i])){
return false;
}
}
return true;
}
正如一些程序员所说,使用 std::string 要好得多。 这里的问题是isValidName()
中的 for 循环始终检查 20 个字符,但不会总是在myInput
中传递 20 个字符。
查看 cin::getline 的文档:
如果 n 大于零,则会自动将空字符 ('\0'( 追加到写入序列中,即使提取了空字符串也是如此。
这意味着长度为 20 的字符数组可能如下所示:
['a','b','c','\0',未定义...]
当您的函数检查所有 20 个字符时,您将检查未定义的字符,这些字符可能不是字母字符。因此,您的函数不提供正确的输出。我稍微更改了您的代码并获得了所需的输出。
bool isValidName(char myInput[])
{
for(int i=0; i<20; i++)
{
if (myInput[i] == ' ') {
break;
}
if(!isalpha(myInput[i])){
return false;
}
}
return true;
}
另请注意,char 数组在输入中只能包含 19 个有用的字符,因为您还需要一个最终终止的空字符。使用 std::string 会有很大帮助。
事实证明,我的评论(部分(错误。std::isalpha
函数将在终止 null 上返回零,这意味着isValidName
将始终返回false
(对于终止字符串(。
但是,如果将未终止的字符串传递给函数,则会超出界限。不过,只要您只使用getline
来读取输入,就不会发生这种情况。
要解决这两个问题(始终返回 false 并且没有越界的风险(,您应该在循环条件中检查边界和终止符:
for(int i=0; i<20 && myInput[i]!=' ; i++)
比像现在这样显式检查自己更好的解决方案是使用标准库中可用的算法函数。最值得注意的是std::any_of
、std::all_of
或std::none_of
(带有合适的谓词。如在
bool isValidName(char* myInput)
{
return std::all_of(myInput, myInput + strlen(myInput), std::isalpha);
}
[请注意,参数类型是一个指针,无论如何char myInput[]
都会被视为指针]
如果字符串碰巧未终止,上面的函数仍然存在问题,但这可以通过使用std::string
来解决:
bool isValidName(std::string const& myInput)
{
return std::all_of(begin(myInput), end(myInput), std::isalpha);
}