我有一些代码,在while
循环中读取name 1
形式的字符串,然后我必须提取整数值以打印yes或no。但是当我尝试使用sscanf
执行此操作时,它仅在循环结束后才向目标整数提供值。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char a[20];
int p = 0;
while (scanf("%s", a)) {
sscanf(a, "%d", &p);
if (p != 0) {
printf("yes");
} else {
printf("no");
}
}
return 0;
}
即使我引入的字符串的整数大于1
,程序也总是打印no
。
我尝试用printfs计算输出,当我执行它时,我看到它给出了以下输出:
printf("%d", p);
对于输入:
name 1
它打印:
0no1yes
正如我所说的,它首先得到的整数为0
,在输入if
后,它变成了1
。
5条答案
按热度按时间i5desfxk1#
在
scanf
的调用中转换说明符
s
只允许读取由空格分隔的文本。也就是说,如果您将输入则第一次调用
scanf
将只读取文本"name"
,并且在循环的下一次迭代中,调用scanf
将读取文本"1"
,其确实可以被转换为整数。在调用
scanf
时需要使用另一个转换说明符。和while循环中的条件
事实上,你有一个无限循环。
你的程序也包含了多余的include指令。
程序可以看起来像下面这样。
qlzsbp2j2#
1.始终格式化您的代码。不是为我们-为您自己
1.检查扫描结果
1.不要使用
scanf
读取行-始终使用fgets
https://godbolt.org/z/dcqc47vh1
nsc4cvqm3#
当您使用
scanf()
从标准输入流读取输入值时,它会将输入值存储在缓冲区中,直到读取所有预期的输入值。如果您没有使用缓冲区中的所有输入值,它们可能会留在缓冲区中,并可能导致程序出现问题。因此,最好使用fgets()
方法从输入流读取数据。nnsrf1az4#
你几乎有正确的方法:你应该用
fgets()
读取一行输入,然后用sscanf()
解析它以提取整数。正如编码的那样,使用
scanf("%s", a)
阅读既不正确又有风险:name
,然后在下一个循环中读取1
。下面是一个简单的替代方案:
但是请注意,上面的代码将接受潜在的无效行,例如
Hello 1 world!
和1 2 3
ugmeyewa5#
您的输入是“name1”,所以第一次读取sscanf不是“成功的”,因为它首先读取的是“name”,而且它也不是一个整数,正如建议的那样,尝试检查您有多少次成功的读取,或者(如果您信任输入)尝试使用
现在sscanf将知道跳过字符串并读取您想要的整数。