scanf中的空间是什么意思?

时间:2011-07-05 12:01:14

标签: c scanf

#include <stdio.h>
int main(int argc, char* argv[]) {
  char c;
  scanf(" %c", &c);
  printf("%c\n", c);
  return 0;
}

[root@test]# ./scanf 
a
a

[root@test]# ./scanf 
 h
h

似乎总是匹配空间是否存在,为什么?

6 个答案:

答案 0 :(得分:9)

  

格式字符串中的空格(如空格,制表符或换行符)与输入中的任意数量的空格匹配,包括

http://www.manpagez.com/man/3/scanf/

答案 1 :(得分:4)

scanf格式的空格意味着从当前位置“跳过所有空格”。由于大多数scanf格式说明符在尝试读取任何内容之前都已跳过所有空格,因此大多数情况下不会以scanf格式使用空格。但是,当您使用不忽略空格的格式说明符时,在必要时将空格包括在格式中(强制跳过)可能有意义。

不忽略空格的说明符是c [n。因此,在其中一个说明符前面指定一个空格会产生影响。否则,它没有任何区别。在您的特定示例中,特别会忽略空格,因为您使用了scanf格式的空格(因为您使用的是%c)。尝试删除空间,看看会发生什么。

答案 2 :(得分:2)

格式字符串中的空白字符将忽略输入中的0个或更多空格字符,直到第一个非空白字符。

答案 3 :(得分:1)

documentation for scanf说:

  

由一个或多个空格字符组成的指令应通过读取输入执行,直到不能再读取有效输入,或者直到第一个不是空白字符的字节仍未读取。

  

应跳过输入空白字符(由isspace指定),除非转换规范包含[,c,C或n转换说明符。

这意味着您需要格式字符串中的空格。但是,如果要读取整数,则空间将是多余的:

/* equivalent statements */
scanf(" %d %d %d", &v1, &v2, &v3);
scanf("%d%d%d", &v1, &v2, &v3);

答案 4 :(得分:0)

空间意味着空间被接受为输入。您可能希望阅读此相关主题,了解使用scanf而不是fgets的危险。

How do you allow spaces to be entered using scanf?

答案 5 :(得分:0)

%c不会像数字格式说明符那样跳过空白字符。 所以如果你使用:

#include<stdio.h>
int main(int argc, char* argv[]){
  char c;
  scanf("%c", &c);
  printf("%c\n", c);
  scanf("%c", &c); // Try running with and without space
  printf("%c\n", c);
  return 0;
}

输入缓冲区中的前一个空格字符很可能会在第二个scanf中被捕获,并且您将无法输入。 %c之前的空格将使scanf跳过输入缓冲区中的任何空格字符,以便您能够正确输入输入。 有时候人们会写出相同的效果:

fflush(stdin);
scanf("%c" &c);

但是这被认为是非常糟糕的编程,因为C Standard指定fflush(stdin)的行为是未定义的。 所以总是在格式字符串中使用空格,除非你有特定的理由来捕获空格。