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 版,朋友可以按這個思路,繼續寫; 印之 大概就是可以簡單地來個迴圈如之前有個人回答的那樣while 給個條件然後scanf輸入等 大概就這麼個意思後面也有高階點的吧但我忘了 賽象鼻 寫好了但是一輸入其他自符就會一直迴圈到崩潰煩惱 include int main int age 0 while age 886 printf 請輸入您... Lvcs 靈活接收資料型別,可以試試使用巨集定義而不用函式 舉個例子 判斷兩個數哪個大 define MAX a,b a b a b 使用巨集定義可以靈活接收各種型別的 a b,而使用函式判斷的話就需要事先設定傳入引數的型別了。 劉燦 傳遞指標同時提供區域長度 不用0來標識字串或區域結束 以typd... 1.如果數字是存在陣列裡的,不論如何都需要遍歷一遍,複雜度O n 只能在常數上優化。2.沒看懂題主為什麼要先sort一下 sort可是O nlgn 的,而且既然都sort了,那麼比如第乙個1出現在位置k上,顯然1的個數是length k 3.沒看懂既然樓主用的是求和的方法為什麼還要去判斷 0,直接加...C 語言如何在不重新執行的情況下連續輸入數字進行判斷?
在C語言中,如何安全地使用void ?
c語言中如何快速的計算僅含有01元素的陣列中1的個數?