關於C語言得非法輸入
- 首先我們來看看什么是非法輸入
# include<stdio.h>
int main(void)
{
int i,j,k;
char ch;
printf("請進行第一次輸入...\n");
scanf("%d",&i);
printf("i=%d\n",i);
printf("----------------\n");
printf("請進行第二次輸入....\n");
scanf("%d",&j);
printf("j=%d\n",j);
printf("----------------\n");
printf("請進行第三次輸入....\n");
scanf("%d",&k);
printf("k=%d\n",k);
return 0;
/*
----------------vc++6.0中輸出得結果-----------------------
請進行第一次輸入...
123
i=123
----------------
請進行第二次輸入....
456
j=456
----------------
請進行第三次輸入....
789
k=789
-------------------------------------------------------------
請進行第一次輸入...
123.。。。。
i=123
----------------
請進行第二次輸入....
j=-858993460
----------------
請進行第三次輸入....
k=-858993460
-------------------------------------------------------------
請進行第一次輸入...
mmmmm
i=-858993460
----------------
請進行第二次輸入....
j=-858993460
----------------
請進行第三次輸入....
k=-858993460
-----------------------------------------------------------
心得:
我們看到只有第一次的輸入是正確的。我們先來說說為什么要使用輸出控制符。
我們從終端中輸入的都是字符或者字符串,例如我們輸入123,在我們看來是數字,但是在計算機看來就是字符,我們在python中也是的,使用的時候需要將字符轉換成為相應的數據類型。
所以我們就是需要使用輸出控制符將字符轉化成為我們需要的數據類型進行輸入。搞懂了為什么要使用輸出控制符,我們再來回答上面的問題。
scanf函數在進行輸入的時候,先對字符串進行讀取,例如"123mmmm",讀取的123符合%d的輸入形式,所以就賦值給了i。但是后面的mmmm不符合%d的輸入形式,繼續的留在輸入的字符串中,等待
下一次的讀取。結果在下面使用scanf函數的時候,率先從上面沒有讀完的地方繼續進行讀寫,mmmm顯然不符合%d所以初始化變量j失敗,系統自動為變量j賦值為垃圾值。這就是為什么出現上面現象
的原因。如果輸出控制符改為%c那就一點問題都沒有了,因為mmmm是滿足這個控制符的。
----------------------------------------------------------
*/
}
我們看到用戶的非法輸入給后面造成了嚴重的影響
- 控制非法輸入
# include<stdio.h>
int main(void)
{
int i,j,k;
char ch;
printf("請進行第一次輸入...\n");
scanf("%d",&i);
printf("i=%d\n",i);
while(ch=getchar()!='\n')
continue;
printf("----------------\n");
printf("請進行第二次輸入....\n");
scanf("%d",&j);
printf("j=%d\n",j);
while(ch=getchar()!='\n')
continue;
printf("----------------\n");
printf("請進行第三次輸入....\n");
scanf("%d",&k);
printf("k=%d\n",k);
return 0;
/*
----------------vc++6.0中輸出得結果-----------------------
請進行第一次輸入...
23mmmmm
i=23
----------------
請進行第二次輸入....
45mmmmmmmmmm
j=45
----------------
請進行第三次輸入....
78mmmmmmmmmmm
k=78
-----------------------------------------------------------
心得:
我們看到加入一個while循環后就解決了這個問題。實際上也是比較好理解的就不細講了。
*/
}