3

这是程序:

#include "stdio.h"

int main()
{
    int minx, x, y, z;

    printf("Enter four ints: ");
    scanf( "%i %i %i %i", &minx, &x, &y, &z);

    printf("You wrote: %d %d %d %d", minx, x, y, z);
}

假设我输入如下:1 2 3 4(然后按enter)。运行并scanf()读取输入缓冲区 = 1 (space) 2 (space) 3 (space) 4 (space)(\n) 它读取直到 (\n) 并且 \n 将保留在缓冲区中。

如果我输入如下:1(然后按enter)2(然后按enter)3(然后按enter)4(然后按enter)。运行并scanf()读取输入缓冲区 = 1(\n)2(\n)3(\n)4(\n)(\n)。

在这两种情况下,scanf()跳过换行符、空格并尝试读取int.

但是如果我输入 1 (然后按enter)(然后按enter)...scanf()如果我继续按 ,则永远不会运行enter

我的问题是:什么触发scanf()?它只会在它知道所有正确的东西%d都放在缓冲区中之后运行,然后如果用户按下回车就运行?

4

2 回答 2

4

因为scanf()忽略空格,而空格包括换行符。

每次都以相同的scanf()方式处理这四个数字:跳过空格,然后读取一个看起来像数字的候选序列(所以符号和数字),并在第一个不能成为候选序列一部分的字符处停止读取; 然后它转换候选序列(溢出等未定义的行为)。如果您在4(而不仅仅是换行符)之后输入了一个空格,则空格和换行符仍将等待下一次读取。如果没有空格,则换行符将等待读取。

如果您输入了非数字字符(标点符号或字母),scanf()则将返回错误(或转换的数字少于 4 个 - 除非字母在第四个数字之后)。

当您键入一个数字后跟任意数量的换行符时,您只是给scanf()空白区域以跳过。它不会停止,直到它收到 EOF(读取零字节)或读取错误(或转换错误,例如字母或标点字符而不是数字)。

于 2012-04-10T03:30:44.993 回答
1

这是 c99 标准中 scanf 的预期行为:

转换规范按以下步骤执行: - 跳过输入的空白​​字符(由 isspace 函数指定),除非规范包含“[”、“c”或“n”说明符。

它在分隔符上进行标记(空格制表符换行符等..)最后一个换行符是标记化的一部分..否则它怎么知道你的整数何时完成?:D

我认为这解决了你的问题?我不知道 。希望这可以帮助

于 2012-04-10T03:38:13.373 回答