gpt4 book ai didi

c - 检查输入是否为字符串的更好方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:25 25 4
gpt4 key购买 nike

我正在制作一个程序,我在其中询问用户名,我只想接受仅包含有效字符(字母)的字符串。

我发现我可以使用

    do{
//since scanf returns the number of currectly input
if(scanf("%s", &name) == 1)
break;
else printf("Please enter a valid name.\n);
}while(1);

    do{
check = 0;
scanf("%s", &name);
for(i=0; i<strlen(name; i++){
//since isalpha() returns != 0 if it's a letter
if(isalpha(name[i]) == 0){
printf("Invalid character. Please enter a valid name.\n");
check = 1;
break;
}
}
}while(check == 1);

但我不确定这些是否有效,以及检查是否除了字母以外没有任何内容会更好。此外,尽管关于将所有输入字母(经过此验证后)设为小写并将第一个字母设为大写

    //all to lower except the first letter
for(i=1; i<strlen(name); i++){
name[i] = tolower(name[i]);
}
//first letter to upper
name[0] = toupper(name[i]);
x=1;
while(name[x] != '\0'){
//if the letter before is a white space, even the first letter, it should place the first letter of a name upper
if(name[x-1] == ' ')
name[x] = toupper(name[x]);
x++;
}

这行得通吗?

最佳答案

if(scanf("%s", &name)读入所有非空白,而不仅仅是字母,到 name如果输入仅为 "\n",则不返回.

if(isalpha(name[i]) == 0){循环还不错,但是scanf("%s", &name)如果输入仅为 "\n",仍然不会返回或者只是空白。

for(i=1; i<strlen(name); i++) name[i] = tolower(name[i])努力使所有后续字母小写,但如果代码重复计算字符串长度效率低下。

将读取数据和解析数据分开。使用 fgets()读取数据和各种代码以测试数据的正确性。

char buf[200];
fgets(buf, sizeof buf, stdin);

int n = 0;
// Skip leading white-space
// Look for A-Z, a-z or space (like a space between first & last)
// Skip white-space like \n
// Save into 'n' the current scan position
sscanf(buf, " %*[A-Za-z ] %n", &n);
if (n > 0 && buf[n] == '\0') Success(); // @user3121023

代码是否需要删除 buf潜在的尾随 "\n" ,建议:

buf[strcspn(buf, "\n")] = 0;

关于c - 检查输入是否为字符串的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30516574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com