1. 程式人生 > >關於scanf輸入資料時要注意的一些地方

關於scanf輸入資料時要注意的一些地方

例:使用scanf函式輸入資料。
1 2 3 4 5 6 7 8 9 10 #include<stdio.h> int main(void) { inta,b,c; printf("輸入a,b,c\n"); scanf("%d,%d,%d",&a,&b,&c); printf("a=%d b=%d c=%d\n",a,b,c); fflush(stdin); return 0; }
注意上面的scanf("%d,%d,%d",&a,&b,&c);中%d,%d,%d之間有逗號,輸入資料時就必須用逗號將各個資料隔開
&a,&b,&c中的&是地址運算子,&a指a在記憶體中的地址。scanf的作用是:按照a,b,c的記憶體地址將a,b,c的值存進去。變數a,b,c的地址是在編譯連續階段分配的。 這裡注意:如果scanf中%d是連著寫的如“%d%d%d”,在輸入資料是,資料之間不可以加逗號,只能是空格或tab鍵或者回車鍵—— 格的輸入方式:“2 3 4” TAB鍵的輸入方式:“2(按tab)3(按tab)4(按tab)”。 回車鍵的輸入方式“2(按ENTER)3(按ENTER)4(按ENTER)”。 若是“%d,%d,%d”,則在輸入資料時需要加“,”——“2,3,4”.

問題一

如何讓scanf()函式正確接受有空格的字串?如: I love you!
1 2 3 4 5 6 7 8 #include<stdio.h> intmain(void) { charstr[80]; scanf("%s",str); printf("%s",str); return0; }
輸入:
1 Iloveyou!
輸入只有 : I 上述程式並不能達到預期目的,scanf()掃描到"I"後面的空格就認為對str的賦值結束,並忽略後面的"love you!".這裡要注意是"love you!"還在鍵盤
緩衝區我們改動一下上面的程式來驗證一下: #include<stdio.h> #include<windows.h> int main(void)
{
char str[80],str1[80],str2[80];
scanf("%s",str);/*此處輸入:Iloveyou!*/
printf("%s\n",str);
Sleep(1000);/*這裡等待5秒,告訴你程式執行到什麼地方*/
/*
不是sleep(5)
1,函式名是Sleep不是sleep。
2,C/C++中,unsignedSleep(unsigned)應該是毫秒ms.
*/
scanf("%s",str1);/*這兩句無需你再輸入,是對stdin流再掃描*/
scanf("%s",str2);/*這兩句無需你再輸入,是對stdin流再掃描*/

printf("%s\n",str1);
printf("%s\n",str2);
return 0;
}
以上程式就能解決問題~~~(額外加了3句) 好了,原因知道了,所以結論是:殘留的資訊 love you是存在於stdin流中,而不是在鍵盤緩衝區中。那麼scanf()函式能不能完成這個任務?回答是:能!別忘了scanf()函式還有一個 %[] 格式控制符(如果對%[]不瞭解的請檢視本文的上篇),請看下面的程式:
1 2 3 4 5 6 7 8 #include<stdio.h> intmain(void) { charstr[50]; scanf("%49[^\n]",str);/*scanf("%s",string);不能接收空格符*/ printf("%s\n",str); return0; }

****************************************************************************************************************************************************************** 在scanf的用法中,不能出現一下情況 scanf("%.2f",&array[i]);
scanf裡面不能有%.2f這樣的格式,因為是鍵盤輸入,不是計算機操作所以很難得到標準格式長度多少,有效是多少, 但是,printf可以用 %.2f 控制輸出小數點的位數    (scanf("%lf",&array[i]);也是允許的~~ 在這裡解釋一下小數點前面是代表長度(超過了長度的話原樣輸出),小數點後面代表是有效位個數(有效位後面的四捨五入),