c - scanf() 将换行符保留在缓冲区中

标签 c scanf

我有以下程序:

int main(int argc, char *argv[])
{
    int a, b;
    char c1, c2;
    printf("Enter something: ");
    scanf("%d", &a); // line 1
    printf("Enter other something: ");
    scanf("%d", &b); // line 2

    printf("Enter a char: ");
    scanf("%c", &c1); // line 3
    printf("Enter another char: ");
    scanf("%c", &c2); // line 4

    printf("Done"); // line 5

    system("PAUSE");

    return 0;
}

正如我在 C 书中读到的,作者说 scanf() 在缓冲区中留下了一个换行符,因此,程序不会在第 4 行停止以供用户输入数据,相反,它将新行字符存储在 c2 中并移至第 5 行。

是吗?

但是,这只发生在 char 数据类型上吗?因为我没有看到第 1、2、3 行中的 int 数据类型存在此问题。对吗?

最佳答案

scanf()在尝试解析字符以外的转换之前,函数会自动跳过前导空格。字符格式(主要是 %c;也扫描集 %[…] — 和 %n)是异常(exception);他们不会跳过空格。

使用带有前导空格的“%c”来跳过可选的空格。不要在 scanf() 格式字符串中使用尾随空格。

请注意,这仍然不会消耗输入流中留下的任何尾随空格,甚至不会消耗到行尾,因此如果还使用 getchar() ,请注意这一点。或fgets()在同一个输入流上。我们只是让 scanf 在转换之前跳过空格,就像它对 %d 和其他非字符转换所做的那样。

<小时/>

请注意,除了转换之外的非空白“指令”(使用 POSIX scanf terminology ),例如 scanf("order = %d", &order); 中的文字文本,不会跳过空格也可以。文字顺序必须与要读取的下一个字符匹配。

因此,如果您想从上一行跳过换行符,但仍需要固定字符串 like this question 上的文字匹配,那么您可能需要 "order = %d" 。 .

关于c - scanf() 将换行符保留在缓冲区中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54172085/

相关文章:

c++ - 两个进程访问临界区时出错

c - 从 C、Xcode 中的文件中读取整数

c - 如何使用scanf检查用户是否输入了整数

c - (C) 在 printf 行显示多个变量,有一些问题

c - 以 DER 格式编写私钥/公钥

c - C99 语言中具有未命名成员的结构的正确行为是什么?

c - 32b x86 程序集 scanf 用法

c - 如何使用fscanf()获取多种格式的字符串?

c++ - 如何创建几分钟无法收割的僵尸进程

c - UNIX:使用 fork() 和 dup2() 在循环中运行进程提前结束循环