C語言中scanf函式與空格回車

2021-09-24 18:05:09 字數 3454 閱讀 5767

1、scanf的返回值

scanf通常返回的是成功賦值(從標準輸入裝置賦值到引數列表所指定的記憶體區域)的資料項數,如果出錯或是遇到end of file(注意,如果想從鍵盤輸入eof,在windows的dos視窗用ctrl+z 或f6;在unix系統上,用ctrl+d。),則返回eof,比如:

scanf("%d%d", &x, &y); scanf函式僅在每乙個資料域均有資料,並按回車後結束

如果x和y都被成功讀入,那麼scanf的返回值就是2;

如果只有x被成功讀入,返回值為1;

如果x和y都未被成功讀入,返回值為0;

如果遇到錯誤或遇到end of file,返回值為eof

2、scanf的處理機制

scanf以刪除的方式從緩衝區讀入資料(來自標準輸入裝置的資料儲存在緩衝區),也就是說,scanf從緩衝區讀入乙個資料項,該資料項在緩衝區中就被清除掉了。而如果scanf需要讀取乙個資料項,發現緩衝區當前是空的,那麼程式就會在scanf**處阻塞,等待使用者輸入,scanf函式接收到相應的資料項之後,在緩衝區中將這一資料項清除,scanf函式返回,程式繼續執行。

3、scanf對不同型別輸入的處理方式

首先,要明確乙個概念:空白字元(white space)。一般,程式中所指的空白字元是指空格(space),回車(enter)和指標符(table)。

3.1 整數%d

對於整型資料的輸入,也就是說"%d"型別的輸入,scanf預設的分割符是所有的空白字元(空格,回車和指標符都行)。也就是說如果乙個scanf函式**現scanf("%d%d",&a,&b),那麼用任何乙個空白字元來分隔兩個整數a,b的值,變數a,b都可以接收到正確的輸入。另外,要注意的是,scanf對於數字輸入,會忽略輸入資料項前面的空白字元。下面是例1:

code:#includeint main()return 0;

}

output:

input the value of a and b:123 456

a=123,b=456

input the value of a and b:123 456

a=123,b=456

input the value of a and b:123

456

a=123,b=456

input the value of a and b:

123 456

a=123,b=456

input the value of a and b: 123 456

a=123,b=456

input the value of a and b: 123 456

a=123,b=456

input the value of a and b:^z

press any key to continue

3.2 字串%s

scanf對於字串輸入的處理和對整數類似,會忽略前導的空白字元,而且預設的分隔符是所有的空白字元。但是,要注意的是,由於c語言中,沒有string型別,都是用char型陣列來表示。因此,scanf會為每乙個輸入的字串最後加乙個『\0』。下面是乙個例子,可以看出scanf這貨的邊界控制還是要小心。如下例2。

#includeint main()return 0;}

執行結果:

3.3 字元%c

scanf在處理對字元資料的輸入時,既不會忽略前導空白字元,預設也沒有任何分隔字元。所有的字元,包括空白字元都會被當成輸入字元。下面是例3。

#includeint main()return 0;}

執行結果:

可以看出,在對字元資料輸入的時候,由於緩衝區中有回車空格等資料,會導致輸入資料比較詭異,為了解決這個問題,有以下方法:

(1) 清空緩衝區

在微軟系統中,有乙個名為fflush(stdin)的函式,可以用來清空緩衝區,如下例4。

#includeint main()return 0;}

執行結果:

(2)將緩衝區的資料讀出來

有的編譯系統並沒有定義stdin的fflush操作,這個時候,可以把緩衝區中的資料讀出來,有如下幾種可行的方法:

1) getchar()

將例4中的fflush(stdin);語句換成

char c;

while((c=getchar())!='\n'&&c!=eof);

執行效果和上面的相同。

2)gets()

char* gets(char* buffer)從stdin流中讀取字串,直至接受到換行符或eof時停止,並將讀取的結果存放在buffer指標所指向的字元陣列中。換行符不作為讀取串的內容,讀取的換行符被轉換為null值,並由此來結束字串。讀入成功,返回與引數buffer相同的指標;讀入過程中遇到eof(end-of-file)或發生錯誤,返回null指標。所以在遇到返回值為null的情況,要用ferror或feof函式檢查是發生錯誤還是遇到eof。

要注意的是gets函式可以無限讀取,不會判斷上限,所以應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢位。如果溢位,多出來的字元將被寫入到堆疊中,這就覆蓋了堆疊原先的內容,破壞乙個或多個不相關變數的值。

將例4中的fflush(stdin);語句換成

char c[10];

gets(c);

執行效果也和上面的相同。

C語言中scanf函式與空格回車

scanf 函式有返回值,且返回值是正確讀取的個數 scanf d d x,y scanf是從快取區讀取資料的 scanf對不同型別輸入的處理方式 前提 空格 回車 製表符table都是空白字元 原因是 scanf n s 接收非回車符,一旦碰到回車就停止,然後進入迴圈裡面執行。但是緩衝區裡面的 n...

C語言中scanf函式

scanf 函式每次讀取乙個字元,跳過所有的空白字元,直至遇到第1個非空白字元才開始讀取。因為要讀取整數,所以 scanf 希望發現乙個數字字元或者乙個符號 或 如果找到乙個數字或符號,它便儲存該字元,並讀取下乙個字元。如果下乙個字元是數字,它便儲存該數字並讀取下乙個字元。scanf 不斷地讀取和儲...

C語言中的scanf函式

思考 如果,我們想拿到使用者輸入的東西,怎麼辦?解決 我們需要使用 scanf 這個函式 1.scanf 的作用 在程式執行到 scanf 的時候,接收使用者輸入的一些資料,並儲存在變數之中 2.scanf 的語法 scanf 格式控制字串 變數位址列表 語義 格式控制字串裡寫佔位符,佔位符用來接收...