c - 关于C中scanf函数的问题

标签 c

我有一个关于 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/

相关文章:

c - 下面的程序不应该崩溃吗?

c - 尝试用 C 从头开始​​构建 BST 树

c++ - 如何检测全局与链路本地 IPv6 地址

c - 理解给定递归函数的目的和区别

c - 为什么普通 header 中的内联 void foo() { ... } 可以正常工作?

c - 为什么当数据类型是 unsigned int 时会无限循环?

c - 重新解释内存/指针

c - 指向 C 中具有不同参数的不同函数的函数指针

c++ - 如何获得与 select() 等效的 poll() 的 POLLHUP?

c - 打印出前八个自守数