【C語言】scanf語句喫掉回車或者空格問題詳解

問題描述:

我們經常在C語言輸入的時候,會發現scanf講空格或者回車“喫掉”了,導致程序的運行結果與預期不一致,以下面一個簡單例子爲例

 #include<stdio.h>
 char str[10];
 int main()
 {
    int i;
	for(i=0;i<10;i++)
	{
		scanf("%c",&str[i]);		
	 } 
		for(i=0;i<10;i++)
	{
		 printf("%c",str[i]);
	 }
	 	return 0;
 }

這個程序,獲取10個數,然後打印出來

如果我們正常的輸入10個字符,打印正常
ru'guo

如果我們輸入a,然後回車,再輸入b,再回車… ,結果只能輸入5個字符,這就是我們經常說的Scanf喫掉了你的回車

那麼我們首先來了解一下scanf語句:

scanf

scanf()函數是格式輸入函數,即按用戶指定的格式從標準輸入設備(鍵盤) 上把數據輸入到指定地址的變量中。

讀取方式:

一般格式爲:scanf(格式控制,地址列表) 也就是scanf("%?",&?); 可以讀取相對於類型的數值並且存儲到制定變量,並且可以讀取多個數值,如數字,字符,字符串等 ,每次用到scanf‘時,他都會從數據緩存區讀取一個或多個字符,並存入相對應的變量中

注意:

  • scanf()在讀取數字時會跳過空格、製表符和換行符!
  • %c只能輸出或輸入一個字符,%s輸出的是一串字符還有就是char a; string s;輸入的時候scanf("%c",&a);這裏的&不能少,而scanf("%s",s);這裏不能有&符號

重點:

scanf遇到 回車(enter),空格,TAB 就會結束一次輸入,空格不會接收

並且, scanf在一次輸入結束後,不會捨棄最後的回車符(即回車符會殘留在數據緩衝區中)

看下方程序

#include <stdio.h>
int main(){
    char c1,c2;
    scanf("%c %c",&c1,&c2);   //這裏有一個空格
    printf("%d %d\n",c1,c2);
 
    scanf("%c%c",&c1,&c2);  //這裏沒有空格
    printf("%d %d\n",c1,c2);
    return 0;
}

在這裏插入圖片描述

第一次輸入a和b正常,沒有問題,但是第二次就出現問題了,

scanf單字符輸入時規定只接收一個字符,所以第一次輸入a b 時 ,第一個scanf("%c %c")之間有一個空格,所以在輸入字符a之後,我們可以輸入空格,enter,,scanf都會自動忽略它(那個空格會讀取停止字符並釋放掉),所以第一次輸入正常,但它卻把回車符也作爲字符對待的。在我們輸入完b之後按回車(Enter),這個回車符是放在緩衝區的,並且不會捨棄最後的回車符此時的數據緩存區中還殘存着一個回車符,

第二次調用scanf("%c%c",&c1,&c2);是從緩衝區中取兩個字符,首先把第一次調用scanf("%c%c",&c1,&c2);後輸入的回車當作輸入字符賦值給c1 ,之後把a賦值給了c2

這就在輸入邏輯上造成了混亂。

我們這樣改一下

#include <stdio.h>
int main(){
    char c1,c2;
    scanf("%c %c",&c1,&c2);   //這裏有一個空格
    printf("%d %d\n",c1,c2);
 
    scanf(" %c %c",&c1,&c2);   //這裏也有了空格
    printf("%d %d\n",c1,c2);
    return 0;
}

第二個scanf中添加了兩個空格 然後我們正常輸入
在這裏插入圖片描述
scanf(" %c",&c)前面這個空格(換成\n或者\t也可以),這樣就把緩衝區中的回車當成第一個字符,讀取後丟掉




可以很好理解scanf中 空格的作用:

空格( )即爲讀取一個結束字符然後丟掉,而普通的字符不受影響

用好之後可以避免很多程序BUG

那麼現在各位應該知道上方的程序怎麼改了

在這裏插入圖片描述
在對應位置加好空格就可以了,

這個問題的解決雖然簡單,但是整個問題出現與解決的原因,纔是我們需要學習的,不能只拘束與添加一個空格,而應該清楚的明白其內部的原理,這是我們學習所必須的一個品質。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章