如何以C scanf的格式解释空间?

时间:2015-09-21 15:44:05

标签: c scanf

我想知道如何以C scanf的格式解释空间。

例如,当我写:

scanf("%d ",&c);

从键盘读取的值不会直接分配给变量c

如果我写:

while(c != 0){
    scanf("%d  ",&c);
    printf("c = %d\n", c);
}

我必须输入两次0才能退出while循环。

有人可以解释这种行为吗?

感谢。

3 个答案:

答案 0 :(得分:4)

我认为c被声明为:

int c;

当您有scanf

scanf("%d  ",&c);

程序将读入c代表int的第一个非空白字符。它将跳过第一个非空白字符之前的所有空格。这解决了格式字符串的%d部分。然后,它处理格式字符串的空白部分。它将等待从流处理读取到c的最后一个字符后面的流中读取所有空格字符。只有在遇到后续的非空白字符时,它才会停止读取。第一个非空白字符可以是任何东西。它不一定是数字/数字。

如果您输入10k作为输入,则会在阅读10后立即停止。 k仍将保留在输入流中。

答案 1 :(得分:1)

" "要求scanf("%d ",&c);在扫描整数后使用所有空白区域。

使用输入是行缓冲的。 <{1}}只发生scanf()'\n'后才会收到任何内容。

实施例

  1. 用户类型:空格 1 2 3 输入,发送{{ 1}}到EOF
  2. " 123\n"使用stdin扫描scanf("%d"并看到它不是数字,“取消”并将其重新放回" 123"
  3. '\n'使用空格stdin等待以获取更多输入进行检查。
  4. 用户类型:空格 4 5 7 输入,发送{{ 1}}到scanf(" "
  5. '\n'继续第3步:扫描" 456\n",使用它,扫描stdin,看到它不是空格,“取消”并将其重新放入{ {1}}。
  6. 格式为scanf(的第二个空格会扫描' '并看到它不是空格,“取消”并将其重新放回'4'
  7. 最后,stdin首先返回。它成功扫描第一个字段时返回1。注意2 输入已经发生。

  8. 下一个scanf(" "会消耗'4',并继续执行上面的第2步。

  9. 建议不要在{-1}}的空白处使用格式结尾。

答案 2 :(得分:0)

N1256 7.19.6.2 fscanf函数

  

由白色空格字符组成的指令通过读取输入来执行   第一个非空格字符(仍未读取),或直到不再有字符   请阅读。

N1256 7.19.6.4 scanf函数

  

2 scanf函数等效于插入参数stdin的fscanf   在scanf的参数之前。