關於scanf輸入資料時要注意的一些地方
阿新 • • 發佈:2019-01-30
例:使用scanf函式輸入資料。
注意上面的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”.
輸入:
輸入只有 : 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()函式還有一個 %[] 格式控制符(如果對%[]不瞭解的請檢視本文的上篇),請看下面的程式:
****************************************************************************************************************************************************************** 在scanf的用法中,不能出現一下情況 scanf("%.2f",&array[i]);
scanf裡面不能有%.2f這樣的格式,因為是鍵盤輸入,不是計算機操作所以很難得到標準格式長度多少,有效是多少, 但是,printf可以用 %.2f 控制輸出小數點的位數 (scanf("%lf",&array[i]);也是允許的~~) 在這裡解釋一下小數點前面是代表長度(超過了長度的話原樣輸出),小數點後面代表是有效位個數(有效位後面的四捨五入),
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()函式正確接受有空格的字串?如: 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!
|
{
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]);也是允許的~~) 在這裡解釋一下小數點前面是代表長度(超過了長度的話原樣輸出),小數點後面代表是有效位個數(有效位後面的四捨五入),