2013-08-30 35 views
1

在读取非空白字符或任何其他数据(例如%d,%c,%s和所有其他格式说明符)之前,scanf会跳过空格字符,然后再读取其他所有格式说明符 。我正在谈论空白字符的第一次出现,而不是后续的字符。 例如,scanf在读取标准输入时的行为

#include<stdio.h> 
#define N 10 
int main(void){ 
char str[N]; 
scanf("%s",str); 
return 0; 
} 

在这种情况下的scanf将跳过的空格字符出现第一和读取下一 非空白数据,然后,如果它再次遇到空白字符,它将退出 读数。

+0

的代码将无法编译; 'str'的​​类型不完整。您需要指定数组大小。 –

+0

这个*编译*? – WhozCraig

+0

@JonathanLeffler我纠正了这一点。 – chanzerre

回答

3

大部分scanf()格式说明符自动跳过前导空格。空白包括换行符 - 请参阅isspace()

三个例外是%c,扫描集(%[a-z]等)和%n

请注意,scanf()格式字符串中的任何空格都是跳过可选空白字符的明确指示。也就是说,如果有空白,它将被跳过;如果下一个字符不是空格,则没有空白可以跳过,但也没有错误。


isspace()的POSIX页遗漏了一些在C标准的信息:

标准空白字符如下:空间(' '),形式进料('\f'),新线 ('\n'),回车('\r'),水平制表符('\t')和垂直制表符()。在 “C”语言环境中,isspace仅对标准空格字符才返回true。

0

如果你想读的非空格之前的空白,你可能需要fgets

#include <stdio.h> 

int main() 
{ 
     char n[10]; 
     fgets(n,10,stdin); 
     printf("%s",n); 
} 

运行程序:

343 5 <<--Input 
    343 5 <<--Output