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 

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

格式string中的空格(如空格,制表符或换行符)与input中的任意数量的空白(包括none )匹配。

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

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

不忽略空格的说明符是c [n 。 所以,在这些说明符之前指定一个空格会有所帮助。 否则,它没有任何区别。 在你的具体例子中,空白被忽略,因为你在你的scanf格式中使用了一个空格(因为你正在使用%c )。 尝试删除空间,看看会发生什么。

格式string中的空白字符将忽略input中的0个或多个空白字符,直到第一个非空白字符。

scanf文档说:

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

并且

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

这意味着格式string中的空格是必需的。 如果你要读取一个整数,那么这个空间将是多余的:

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

空间只是意味着空间被接受为input。 你可能想阅读这个相关的线程使用scanf而不是fgets的危险。

你如何允许使用scanfinput空格?

%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; } 

input缓冲区中的前一个空白字符很可能会在第二个scanf中被采用,而您将不会有机会input。 %c之前的空格将使scanf跳过input缓冲区中的任何空格字符,以便您能够正确地input您的input。 有时为了得到相同的效果,人们写道:

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

但是这被认为是非常糟糕的编程,因为C标准规定fflush(stdin)的行为是未定义的。 所以总是在格式string中使用空格,除非您有特定的理由来捕获空格。