如何允许用户输入带有空格的字母(例如 John Mike),但不允许用户输入带有数字值的字母?
将输入的整个行读入一个字符串,然后处理该字符串。
评估字符串的合法字符和模式。
重要的是要在有效的事情上慷慨并考虑各种文化问题。名称有效性测试是一个敏感问题。很容易得到negative feed 尝试讨论它。也可以考虑not constructive。
使用isalpha() 进行第一级检查,然后检查其他有效字符以确保至少有一个字母。
isalpha() 对locale 敏感,并提供一些 级别的国际化。
#include <ctype.h>
#include <stdbool.h>
bool name_test1(const char *s) {
const char *between_char = "-'"; // Allow O'Doul, Flo-Jo. Adjust as needed
bool valid = false;
while (*s) {
if (isalpha((unsigned char ) *s)) {
valid = true;
} else if (*s == ' ' && valid) { // or isspace((unsigned char) *s) for any white-space
valid = false; // valid char must follow
} else if (strchr(between_char, *s) != NULL && valid) {
valid = false; // valid char must follow
} else {
return false;
}
s++;
}
return valid;
}
*s == ' ' && valid 中的 && valid 确保前导空格无效。
例子:
void ntest(const char *s) {
printf("%d <%s>\n", name_test1(s), s);
}
int main(void) {
ntest("John Mike");
ntest("John34 Mike");
ntest("John Mike ");
ntest(" John Mike");
ntest("Flo-Jo");
ntest("O'Doul");
char name[100];
while (fgets(name, sizeof name, stdin)) {
name[strcspn(name, "\n")] = '\0'; // lop off potential trailing \n
if (name_test1(name)) puts("Acceptable name");
else puts("Unacceptable name");
}
}
1 <John Mike>
0 <John34 Mike>
0 <John Mike >
0 < John Mike>
1 <Flo-Jo>
1 <O'Doul>
...
最好不使用scanf("%[^\n]",&name); 它有问题:它读取几乎一行,'\n' 未被读取。只有"\n" 的一行是个问题。它没有防止缓冲区过度运行的保护。