gpt4 book ai didi

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

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

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

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