我有一个关于 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;
}
如果用户输入一个数字然后按回车键,那么 scanf 函数将从格式字符串中看到应该是一个数字。当用户点击回车时,它不会读取换行符并将其放回缓冲区。然后,因为我接下来要读取一个字符,所以我需要在格式字符串中有一个空格,否则 scanf 函数会采用换行符并放入 y 变量中。
不过我很好奇如果用户写了类似
的东西会发生什么j344lk4fjk388
它会把所有东西放回缓冲区吗?缓冲区中“放回”的所有内容都会被我程序中的下一个 scanf 函数自动读取吗?
I'm reading: C Programming A Modern Approach 2nd Edition
最佳答案
您应该始终检查 scanf()
的返回值,以确保您预期的所有转换都成功。
给定示例输入:
j344lk4fjk388
第一个 scanf()
会失败,因为 j
无法转换为整数 - 成功转换的次数返回 0。第二次调用会成功,返回 'j' 作为字符。
如果您需要将字符串视为整数,请使用 fgets()
或相关(可能是 POSIX getline()
)来读取字符串,然后 strtoul()
(或适当的相关 - strtol()
、strtoll()
、strtoull()
、strtoimax()
或 strtoumax()
),指定至少 21 的基数来转换“j”,或 23 来转换“l”和“k”。
关于c - 关于C中scanf函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5759234/