我想验证用户输入,确保他们只输入常规字符(0-9、A-Z 和 a-z 的组合)。
这就是我所拥有的,但它匹配的字符串如“adsifj%a%%dosif”。我不想要。如果那些无效字符在开头,它将不会匹配。我该如何解决这个问题?
int main(){
char name[128];
int match = scanf(" %[0-9a-zA-Z^\n]", name);
printf("%d", match);
if (match == 1){
printf("Matched");
}else{
printf("Invalid");
}
return 0;
最佳答案
代替:
int match = scanf(" %[0-9a-zA-Z^\n]", name);
你应该写:
char line[80], name[80];
char toomuch;
if (fgets(line, sizeof line, stdin) != NULL && sscanf(line, " %79[0-9A-Za-z] %c", name, &toomuch) == 1) {
printf("name=(%s)\n", name);
}
首先,使用fgets
读取整行。然后,使用 sscanf
将该行拆分为标记。第一个标记是常规名称,第二个标记是名称后的下一个非空格字符。
如果该行由任何空格组成,然后是一个常规单词,然后是任何空格,然后结束,则输入是有效的。不能有任何其他字符留下。这就是为什么我正在读取 2 个标记(name 和 toomuch)但只希望成功读取 1 个(== 1
)。
在 fgets
和 sscanf
之间拆分工作是必要的。如果将它们组合成 scanf("%80[0-9A-Za-z] %c", name, &toomuch)
,则 %c
需要读取一个有时第二行,尤其是当您输入正确的常规名称时。
注意 sscanf
参数中的 %79
。有必要防止缓冲区溢出。
关于c - 在 C 中使用 scanf 匹配常规字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40227558/