我想创建一个简单的 C程序,以允许用户输入他们的名字并打印出他们的名字(例如John Mike)。但我也希望程序禁止用户在名称中键入数字值(例如John34 Mike)。
我知道如何使用scanf("%[^\n]",&name);
,但该用户可以意外在输入名称中输入数字。
我想禁止用户输入带数字值的字母。
有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
如何允许用户输入带空格的字母(例如John Mike),但不允许用户输入带数字值的字母?
将输入的整个行读入字符串,然后处理字符串。
评估字符串中的合法字符和模式。
重要的是慷慨有效并考虑各种文化问题。名称有效性测试是一个敏感问题。很容易negative feed试图讨论它。也可以考虑not constructive。
使用isalpha()
进行第一级检查,然后检查确保至少一个alpha的其他有效字符。
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;
}
&& valid
中的*s == ' ' && 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"
一行是个问题。它无法防止过度运行缓冲区。
答案 1 :(得分:-1)
使用getline功能获取输入。然后使用isdigit函数检查字符串以允许或禁止输入字符串。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
FILE *stream;
char *line = NULL;
size_t len = 80;
ssize_t nread;
nread = getline(&line, &len, stdin);
printf("Retrieved line %s", line);
for(int i=0;line[i]!='\0';i++)
if(isdigit(line[i])){
printf("Disallow\n");
return 0;}
printf("Allow\n");
return 0;
}