我有一个关于scanf函数如何工作的问题。在这个计划中:
#include <stdio.h>
int main(void) {
int x;
char y;
printf("Write a number: ");
scanf("%d", &x);
printf("Write a character: ");
scanf(" %c", &y);
printf("%d", x);
printf("%c", y);
return 0;
}
如果用户写了一个数字,然后按Enter键,那么scanf函数将从格式字符串中看到应该预期的数字。当用户点击输入时,它不会读取换行符并将其放回缓冲区。然后,由于我正在读取一个字符,我需要在格式字符串中有一个空格,因为scanf函数否则将采用换行符并放入y变量。
但是我很好奇如果用户写了类似
的内容会发生什么j344lk4fjk388
它会把所有东西放回缓冲区吗?并且在缓冲区中“放回”的所有内容都会被我程序中的下一个scanf函数自动读取?
答案 0 :(得分:1)
错误处理
scanf通常用于某些情况 当程序无法保证 输入采用预期格式。 因此,必须检查强大的程序 scanf调用是否成功 采取适当的行动。如果输入 没有正确的格式, 错误的数据仍将存在 输入流,必须阅读和 在新输入之前丢弃 读。另一种阅读方法 输入,避免这种情况,是使用 fgets然后检查字符串读取 in。最后一步可以完成 例如,sscanf。
答案 1 :(得分:1)
您应始终检查scanf()
的返回值,以确保您预期的所有转化都成功。
给出样本输入:
j344lk4fjk388
第一个scanf()
将失败,因为j
无法转换为整数 - 返回0表示成功转换的数量。第二个调用将成功,将'j'作为字符返回。
如果您需要将字符串视为整数,请使用fgets()
或相对(可能是POSIX getline()
)来读取字符串,然后strtoul()
(或相应的相对 - strtol()
,strtoll()
,strtoull()
,strtoimax()
或strtoumax()
),指定至少21的基数来转换'j',或23指定'l'和'k'。
答案 2 :(得分:0)
它会将与scanf不匹配的所有内容放回缓冲区。例如:scanf("%i %i",...)
如果输入“12 qwe
”将qwe
保留在缓冲区中,而不是12
。 (spec表明它不会放回空间,并且快速测试确认。)也就是说,文档相当不清楚,并且在没有进行大量测试的情况下依赖它可能是一个坏主意。