1. 程式人生 > >scanf()中的陷阱

scanf()中的陷阱

關於scanf()函式中存在許多陷阱,是c語言初學者要注意的。

#include <stdio.h>   
main() 
int a; float b; char c; 
printf("請輸入a的值:"); 
scanf("%d",&a); 
printf("請輸入b的值:"); 
scanf("%f",&b); 
printf("請輸入c的值:"); 
scanf("%c",&c); 
printf("a=%d,b=%f,c=%c",a,b,c); 
}
        這段程式碼很簡單,但是在執行過程中,你在輸入a和b的值後系統就自動在螢幕上輸出a和b的值並結束運行了

   我們每次在輸入一個變數的值後,必須按回車鍵告訴程式我已經完成了這個變數的輸入並輸入下一個變數的值,但回車鍵或空格鍵、製表鍵本身也都算是一個字元。 當輸入的變數的格式是char字元格式時,&c就會自動接收我們之前輸入的回車鍵,則無法輸入這個scanf語句的內容了。 
在這個程式中就體現為scanf("%c",&c);語句中的&c自動接收我們在輸入變數b的值後按的那個回車。 
解決辦法就是在scanf("%c",&c);語句中的雙引號中%c前面加上空格或者tab鍵。注意要加到雙引號裡面,如果加到雙引號前面了是沒有作用的。 

第二個問題

#include<stdio.h> 
main() 
int a,b; 
printf("請輸入兩個數\n"); 
scanf("%d,%d",&a,&b); 
printf("a=%d,b=%d\n",a,b); 
}

在輸入 a 的值後直接按回車就會發生執行錯誤
先輸入1,再輸入“,”,再輸入2。 

這裡存在一個特例,就是在printf語句中多次提到的轉義符\n 
在printf函式語句中我們經常通過轉義符來完成我們對輸出內容形式的一些需要,但是在scanf語句中沒必要使用,這個\n在scanf語句中並沒有什麼用。

scanf("\n%d%d",&a,&b); 
scanf("%d\n%d",&a,&b); 
轉義符放在雙引號內容的前面或中間,\n可以直接無視,

但如果像下面這樣。 
scanf("%d%d\n",&a,&b); 
\n放在了雙引號裡內容的最後,在輸入a和b的值時我們就會發現在輸入a和b兩個變數的值後無論你按多少個回車程式都不會進行下一步的執行,即用printf函式輸出a和b。 
那麼應該怎樣解決這個問題呢? 
答案是在輸入變數a和b的值後你還需要隨便再輸入一個值,然後再按回車系統就會正常輸出a和b的值,而你最後隨便輸入的那個值並不會在最後的輸出中體現出來。 
出現這個問題的原因是:如果輸入資料用轉義符結尾,scanf會跳過後面的轉義符去接受下一個字元。 
直觀地描述就是如果你用轉義符結尾,程式就會跳過你接了下來輸入的回車或空格,直到你輸入下一個字元。 
在這裡要注意的是上面所指的會導致系統出現問題是轉義符(在這裡準確的說是空白符),也就是說不只是\n,\t(製表符號)、tab鍵和空格鍵都會發生同樣的問題。

最後,有這樣一個簡單的程式,是網上看別人寫的

#include<stdio.h>
int main()
{
	char a[10005];
	int n,i,j;
	scanf("%d ",&n);
	while(n--)
	{

		a[0]=0;
		i=1;
		a[i]=getchar();
	
		while(a[i]!='\n')
		{
			if(a[i]==']' && a[i-1]=='[' || a[i]==')' && a[i-1]=='(')
			{
				i--;
			} 
			else
			{
				i++;
			} 
			a[i]=getchar();
	}
	if(i>1) 
		printf("No\n");
	else
		printf("Yes\n");
	}
	return 0;
}

這裡有很多巧妙的地方,我也不是很理解,待解決......