2013-08-30 40 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