c - 在 C 中使用 scanf 匹配常规字符

标签 c scanf

我想验证用户输入,确保他们只输入常规字符(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)。

fgetssscanf 之间拆分工作是必要的。如果将它们组合成 scanf("%80[0-9A-Za-z] %c", name, &toomuch),则 %c 需要读取一个有时第二行,尤其是当您输入正确的常规名称时。

注意 sscanf 参数中的 %79。有必要防止缓冲区溢出。

关于c - 在 C 中使用 scanf 匹配常规字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40227558/

相关文章:

c - 如何使用fscanf,关心endofline?

c - 删除链表中的第一个节点

c - 如果函数调用本身充当内存屏障,为什么 pthread_mutex_lock() 和 pthread_mutex_unlock() 包含内存屏障?

c - 如何区分字符和数字?

c - 我正在尝试根据子函数的退出值从主函数进行打印

c - sscanf 处理最大无符号整数值的方式与赋值不同

c++ - sed/regex - 更新具有范围问题的源文件

c - 如何将 Turbo-C 远指针分配和取消引用转换为 x86 程序集?

c - 单片机通过虚拟串口不断接收值 "255ld"

c - 如何在 C 中的 scanf() 函数中使用无限类型说明符?