关于C中scanf函数的问题

时间:2011-04-22 19:28:37

标签: 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;
}

如果用户写了一个数字,然后按Enter键,那么scanf函数将从格式字符串中看到应该预期的数字。当用户点击输入时,它不会读取换行符并将其放回缓冲区。然后,由于我正在读取一个字符,我需要在格式字符串中有一个空格,因为scanf函数否则将采用换行符并放入y变量。

但是我很好奇如果用户写了类似

的内容会发生什么
  

j344lk4fjk388

它会把所有东西放回缓冲区吗?并且在缓冲区中“放回”的所有内容都会被我程序中的下一个scanf函数自动读取?

  

我正在阅读:C Programming A Modern Approach 2nd Edition

3 个答案:

答案 0 :(得分:1)

  

错误处理

     

scanf通常用于某些情况   当程序无法保证   输入采用预期格式。   因此,必须检查强大的程序   scanf调用是否成功   采取适当的行动。如果输入   没有正确的格式,   错误的数据仍将存在   输入流,必须阅读和   在新输入之前丢弃   读。另一种阅读方法   输入,避免这种情况,是使用   fgets然后检查字符串读取   in。最后一步可以完成   例如,sscanf。

http://en.wikipedia.org/wiki/Scanf

答案 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表明它不会放回空间,并且快速测试确认。)也就是说,文档相当不清楚,并且在没有进行大量测试的情况下依赖它可能是一个坏主意。