在c語言中如何防止輸入錯誤的資料型別

時間 2021-10-30 20:47:44

1樓:站起來

這問題,一看就是初學C語言,進入了迷茫期,前方霧濛濛,看不到該往哪走。

指個路吧:scanf僅供學習程式設計之用,實際工程中用不到,別在這浪費時間了。

實際工程中我們都寫圖形介面,用不著scanf摻和。

2樓:

方法一:

利用 scanf 的返回值,來判斷是否有錯誤輸入;如果錯誤,則用 scanf("%*s") 來清空鍵盤緩衝區,避免它繼續影響下次讀入;

例如,我們要輸入 3 個整數,則可以寫if(

3>scanf

("%d %d %d",&

a,&b

,&c))

else

scanf 的返回值,是乙個int 型,它等於,正常讀取到的資料個數;

例如,你輸入 "3 6 -2",它返回 3;

你輸入 "36 1024 a",它返回 2;

但是,你輸入 "a 36 1024",它就返回 0 了,而不是 2;因為,它第一次讀到錯誤的內容,並不會主動清空這個快取,而是會保留這個 "a",從而使得後面兩次讀取也失敗;

所以,這個方法只適合,每次讀取乙個資料的情況,不適合連續讀取;

方法二:

以字串的形式,讀取一行字元,然後分析逐個字元,判斷格式是否正確;

這種方法,比前者更好,因為你不必再,清空鍵盤的緩衝區了,而且可以讀取多個資料;

先來乙個,簡單一點的,每次讀乙個資料;注意,scanf("%s", Str) 遇到了空格、Tab、回車之一,就會結束讀取;

在標頭檔案裡,定義如下的乙個類:

class

Catpublic

:int

*StrToInt

(char

*Str

)int

Sum=0;

for(;Ch=

*p;++

p)else

}int

*Ans=(

int*

)malloc

(sizeof

(int

));*

Ans=

(Sig

*Sum

);return

(Ans);}

double

*StrToDou

(char

*Str

)bool

No_Dot

=true

;double

Sum=0;

for(;Ch=

*p;++

p)if(

IsNum(Ch

))else}if

(No_Dot

)doublepo=

1.0;

for(++p

;Ch=*

p;++p

)else

}double

*Ans=(

double*)

malloc

(sizeof

(double

));*

Ans=

(Sig

*Sum

);return

(Ans);}

};然後在原始檔裡,寫 7 行即可:

#include

#include

#include

"Cat.h"

intmain

(int

argc

,char

**argv

)free

(Str

);scanf

("%*s"

);return0;

}把 "StrToInt" 改成 "StrToDou",把int* 改成 double*,把 %d 改為 %lf,就可以識別小數:

如果想要公升級,一次讀取多個型別相同或不同的資料,那可以一次性讀取多個字串,然後分別按對應的方式來解讀;或者是,用以下的方法,直接讀入一整行字符:

char

*InputLine

(char

*Str

,int

StrLen

)如果連續讀取若干個相同資料,可以直接返回乙個陣列,例如

#include

#include

class

Catbool

IsBreak

(charCh)

}return

(false);}

intStrToInt

(char

*Str

)int

Sum=0;

for(;*p

;++p)

}return

(Sig

*Sum);}

public

:bool

InputStr

(char

*Str

,int

Size

)char*p

=Str-1

;charCh=

0;for(

inti=0

;i

i)*(

++p)=

Ch;}*

(++p)

='\0'

;return

(true);}

int*

GetAr

(char

*Str

,int

&ALen

)char*q

=Str

;for(;*

q;++q

);int*Ar

=(int*

)calloc((q

-Str

),sizeof

(int

));int*i

=Ar-1

;for

(char*p

=q=Str;*

p;++p

)}*(

++i)=

StrToInt(q

);if(i

ALen=1

+i-Ar

;return(Ar

);}};int

main

(int

argc

,char

**argv

)else

}free

(Str

);scanf

("%*s"

);return0;

}這裡面還可以再優化,我還沒寫 double 版,朋友可以按這個思路,繼續寫;

C 語言如何在不重新執行的情況下連續輸入數字進行判斷?

印之 大概就是可以簡單地來個迴圈如之前有個人回答的那樣while 給個條件然後scanf輸入等 大概就這麼個意思後面也有高階點的吧但我忘了 賽象鼻 寫好了但是一輸入其他自符就會一直迴圈到崩潰煩惱 include int main int age 0 while age 886 printf 請輸入您...

在C語言中,如何安全地使用void ?

Lvcs 靈活接收資料型別,可以試試使用巨集定義而不用函式 舉個例子 判斷兩個數哪個大 define MAX a,b a b a b 使用巨集定義可以靈活接收各種型別的 a b,而使用函式判斷的話就需要事先設定傳入引數的型別了。 劉燦 傳遞指標同時提供區域長度 不用0來標識字串或區域結束 以typd...

c語言中如何快速的計算僅含有01元素的陣列中1的個數?

1.如果數字是存在陣列裡的,不論如何都需要遍歷一遍,複雜度O n 只能在常數上優化。2.沒看懂題主為什麼要先sort一下 sort可是O nlgn 的,而且既然都sort了,那麼比如第乙個1出現在位置k上,顯然1的個數是length k 3.沒看懂既然樓主用的是求和的方法為什麼還要去判斷 0,直接加...