回覆列表
-
1 # 程式生人
-
2 # 成都茂大叔
程式,沒有奇怪錯誤,只有無知導致的困惑…
程式的錯誤大致可以分為三類:
1.編譯時錯誤
2.執行時錯誤
3.非預期結果
你所描述的非法輸入形成的奇怪錯誤,可以是第2、3類錯誤。
有可能是輸入的資料與程式要求不一致,導致程式無法繼續繼續進行。例如輸入了0作為除數,導致程式無法運算。
也有可能是程式輸出不合預期,例如輸入字串過長導致字串被截斷…
這些錯誤的形成是因為程式本身對於非法資料的容錯能力不足導致的,沒什麼好奇怪的。
C語言的輸入大多使用:C標準庫的<stdio.h>檔案中的scanf函式進行輸入。scanf函式稱為格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。
scanf函式的一般形式:scanf函式是一個標準庫函式,它的函式原型在標頭檔案“stdio.h”中。與printf函式相同,C語言也允許在使用scanf函式之前不必包含stdio.h檔案。
scanf函式的一般形式為:scanf(“格式控制字串”, 地址表列);
1、地址表列
其中,格式控制字串的作用與printf函式相同,但不能顯示非格式字串,也就是不能顯示提示字串。
地址表列中給出各變數的地址。地址是由地址運算子“&”後跟變數名組成的。
例如:&a、&b分別表示變數a和變數b的地址。
這個地址就是編譯系統在記憶體中給a、b變數分配的地址。在C語言中,使用了地址這個概念,這是與其它語言不同的。 應該把變數的值和變數的地址這兩個不同的概念區別開來。變數的地址是C編譯系統分配的,使用者不必關心具體的地址是多少。
scanf函式在本質上也是給變數賦值,但要求寫變數的地址,如&a。這兩者在形式上是不同的。&是一個取地址運算子,&a是一個表示式,其功能是求變數的地址
2、格式字串
格式字串的一般形式為:
%[*][輸入資料寬度][長度]型別
其中有方括號[]的項為任選項。各項的意義如下。
型別
表示輸入資料的型別,其格式符和意義如下表所示。
格式 字元意義
d 輸入十進位制整數
o 輸入八進位制整數
x 輸入十六進位制整數
u 輸入無符號十進位制整數
f或e 輸入實型數(用小數形式或指數形式)
c 輸入單個字元
s 輸入字串
“*”符
用以表示該輸入項,讀入後不賦予相應的變數,即跳過該輸入值。如:
scanf("%d %*d %d",&a,&b);
當輸入為:1 2 3時,把1賦予a,2被跳過,3賦予b。
寬度
用十進位制整數指定輸入的寬度(即字元數)。例如:
scanf("%5d",&a);
輸入12345678只把12345賦予變數a,其餘部分被截去。又如:
scanf("%4d%4d",&a,&b);
輸入12345678將把1234賦予a,而把5678賦予b。
長度
長度格式符為l和h,l表示輸入長整型資料(如%ld)和雙精度浮點數(如%lf)。h表示輸入短整型資料。
1 輸入的資料格式不正確,比如要求輸入整型,但是輸入了字元型。這種情況,可以透過scanf的返回值進行判斷,scanf的返回值是正確輸入的變數個數。當返回值和要輸入的變數個數不同時,則表示出錯,要求重新輸入。
2 輸入的資料不在合法範圍內。比如要求輸入正數,但輸入了負數。這時需要判斷輸入的值是否合法。
3 格式字串中的格式字元與後邊輸出列表中的元素型別不一一對應。
4格式字串中的格式字元的個數要與輸出列表中的元素個數不相同。
5 輸入的資料過多導致記憶體溢位。