提问人:vojtam 提问时间:10/15/2023 最后编辑:TechGeek49vojtam 更新时间:10/16/2023 访问量:95
Scanf() 不区分括号
Scanf() does not distinguish between brackets
问:
我有这个测试代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
int a, b;
int ret = scanf("( %d , %d )", &a, &b);
if (ret != 2 ){
printf("Wrong input!\n");
return EXIT_FAILURE;
}
printf("Everything fine\n");
return EXIT_SUCCESS;
}
如您所见,main 函数需要输入,例如 。此输入失败。但是这个输入是可以的。为什么呢?如何使用scanf()在括号类型之间进行区分?(10, 15)
(10, 15test
(10, 15]
答:
2赞
Ted Lyngmo
10/15/2023
#1
这两者都可以使用,并且将成功提取两个:scanf
int
(10, 15test
(10, 15]
不匹配的部分 和 将保留在输入流中,因此如果或不是预期的,则下一个完成很可能会失败。test
]
scanf
test
]
这意味着,如果你有一个循环:
while (scanf("( %d , %d )", &a, &b) == 2) {
printf("%d, %d\n", a, b);
}
并给出上面的输入,只有第一个会成功。scanf
要在成功提取后丢弃所有内容,您可以一直读取到行尾,或者一直只读取完整的行,然后一次解析一行:sscanf
char buf[1024];
while (fgets(buf, sizeof buf, stdin) && sscanf(buf, "( %d , %d )", &a, &b) == 2) {
printf("%d, %d\n", a, b);
}
如果要验证数字后面是否包含 a,则需要提取:)
)
char buf[2];
scanf(" ( %d , %d %1[)]", &a, &b, buf) == 3
(或同上使用)sscanf
3赞
dave_thompson_085
10/15/2023
#2
请注意,%d 之前不需要空格 -- 所有数字 scanf 说明符,以及 %s,但不包括 %c 和 %[...],跳过任何与空格相同的前导空格。如果要在逗号和 %1[)] 之前允许空格,则需要空格,而示例数据未显示空格。
int a,b; char c[2 /* or more */];
int ret = scanf("(%d ,%d %1[)]", &a,&b,c);
if( ret == 3 ) // all good
评论
scanf()
不是这项工作的合适工具。