#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中的空間是什麼意思?
#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中的空間是什麼意思?
白空間(如空格,製表符或換行符)在格式字符串匹配的白色空間的任何量,包括無,在輸入。
它與「RETURN」鍵匹配嗎? –
@Je Rog:它不符合「鑰匙」。它匹配輸入*字符*。換行符被認爲是空白的,所以是的,它會跳過換行符。 – AnT
是的,空間可以用來匹配「換行符」。請小心,在Windows中,當您點擊RETURN時,通常會發送「\ r \ n」,而在Linux中只發送「\ n」。但是對於簡單的數字輸入掃描,通常這並不重要,因爲一旦數字轉換成非數字(根據要掃描的輸入類型允許使用''''''和'+',數字轉換就會停止) –
空間在scanf
格式的意思是 「跳過所有空白」 從當前位置。由於大多數scanf
格式說明符在嘗試讀取任何內容之前已經會跳過所有空格,因此大多數情況下空格不會以scanf
的格式使用。但是,當您使用不忽略空格的格式說明符時,在必要時(包括強制跳過)將格式的空格包括在格式中可能是有意義的。
不忽略空格的說明符是c
[
和n
。因此,在這些說明符之前指定一個空格會有所幫助。否則,它沒有任何區別。在您的具體示例中,由於您在scanf
格式中使用了空格(因爲您使用的是%c
),所以空格被忽略。嘗試刪除空間,看看會發生什麼。
該空間僅表示空間被接受爲輸入。你可能想閱讀這個相關的線程關於使用scanf而不是fgets的危險。
在格式字符串空白字符將忽略從輸入0或多個空白字符,直到所述第一非空白字符。
的一個或多個空白字符構成的指示字應通過讀取輸入來執行,直到沒有更多的有效輸入可以被讀取,或至多這不是第一個字節空白字符,它仍然未讀。
並且還
輸入的空白字符(如由isspace指定)應當被跳過,除非轉換規範包括[,C,C,或n轉換說明。
這意味着需要格式字符串中的空格。但是,如果要讀取整數,則空間將是多餘的:
/* equivalent statements */
scanf(" %d %d %d", &v1, &v2, &v3);
scanf("%d%d%d", &v1, &v2, &v3);
%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的行爲是不確定的。 所以總是在格式字符串中使用空格,除非您有特定的理由來捕獲空格。
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