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

[[email protected]]# ./scanf 
a 
a 

[[email protected]]# ./scanf 
h 
h 

看起來總是匹配空間是否存在,爲什麼?scanf中的空間是什麼意思?

+1

http://linux.die.net/man/3/scanf,http://www.manpagez.com/man/3/scanf/,http://unixhelp.ed.ac.uk/CGI/ man-cgi?scanf + 3,GIYF – sehe

回答

9

白空間(如空格,製表符或換行符)在格式字符串匹配的白色空間的任何量,包括,在輸入。

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

+0

它與「RETURN」鍵匹配嗎? –

+1

@Je Rog:它不符合「鑰匙」。它匹配輸入*字符*。換行符被認爲是空白的,所以是的,它會跳過換行符。 – AnT

+0

是的,空間可以用來匹配「換行符」。請小心,在Windows中,當您點擊RETURN時,通常會發送「\ r \ n」,而在Linux中只發送「\ n」。但是對於簡單的數字輸入掃描,通常這並不重要,因爲一旦數字轉換成非數字(根據要掃描的輸入類型允許使用''''''和'+',數字轉換就會停止) –

4

空間在scanf格式的意思是 「跳過所有空白」 從當前位置。由於大多數scanf格式說明符在嘗試讀取任何內容之前已經會跳過所有空格,因此大多數情況下空格不會以scanf的格式使用。但是,當您使用不忽略空格的格式說明符時,在必要時(包括強制跳過)將格式的空格包括在格式中可能是有意義的。

不忽略空格的說明符是c[n。因此,在這些說明符之前指定一個空格會有所幫助。否則,它沒有任何區別。在您的具體示例中,由於您在scanf格式中使用了空格(因爲您使用的是%c),所以空格被忽略。嘗試刪除空間,看看會發生什麼。

2

在格式字符串空白字符將忽略從輸入0或多個空白字符,直到所述第一非空白字符。

1

documentation for scanf說:

的一個或多個空白字符構成的指示字應通過讀取輸入來執行,直到沒有更多的有效輸入可以被讀取,或至多這不是第一個字節空白字符,它仍然未讀。

並且還

輸入的空白​​字符(如由isspace指定)應當被跳過,除非轉換規範包括[,C,C,或n轉換說明。

這意味着需要格式字符串中的空格。但是,如果要讀取整數,則空間將是多餘的:

/* equivalent statements */ 
scanf(" %d %d %d", &v1, &v2, &v3); 
scanf("%d%d%d", &v1, &v2, &v3); 
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標準規定(標準輸入)fflush的行爲是不確定的。 所以總是在格式字符串中使用空格,除非您有特定的理由來捕獲空格。