1樓:
用 fgets() 限定長度,保證輸入的記憶體安全;
用 strtoint() 簡單轉換。
char
str[
50];
fgets
(str,50
,stdin
);strtoint() 可以寫成過程,voidstrtoint
(char
*str
,int
*integer
)如果使用 stdlib.h 的 atoi(),對於太長的字串,atoi() 文件裡也沒有說有任何限制。直接轉換,int 可能存放不下。
那麼只能巢狀迴圈,對 str 內每乙個字母進行轉換(所以這步 'ch' - '0' 就可以)。(參考:atoi - C++ Reference)
陣列每一位儲存乙個數字。
避免使用 scanf() 這個可能重寫緩衝區的函式。
我還是有點擔心對 str* 的指標呼叫,寫 char str 和 char* str 有區別嗎?反正前面這個是錯的。最搞不清楚指標了。
更新:
新問題:fgets(str, length, stdin); 會把第一次呼叫的標準流繼續放入第二次呼叫,第一次結尾是個分行符,第二次呼叫就直接退出。用迴圈巢狀 getch()?
這輸入流的爛設計,根本就不所謂「安全」。
2樓:
A function in "stdlib.h"
intatoi(const char *nptr);
ASCII to integer
不過不是標準函式。
3樓:管清文
如果題主用的是純C,貌似沒有太好的方法。。。我只是新增了自動分配記憶體(需要使用者手動釋放)
int*
str2int
(int
*dst
,const
char
*src
)for
(inti=
0;i<
len;++i
)return
dst;
}如果題主可以用C++,一下子世界簡單了。。。
std::vector str2int(const std::string &sstd::
vector resultstd::transform( s.begin(), s.
end(), back_inserter(result), std::bind2nd( std::minus(), '0'return result;}
在C語言中,如何安全地使用void ?
Lvcs 靈活接收資料型別,可以試試使用巨集定義而不用函式 舉個例子 判斷兩個數哪個大 define MAX a,b a b a b 使用巨集定義可以靈活接收各種型別的 a b,而使用函式判斷的話就需要事先設定傳入引數的型別了。 劉燦 傳遞指標同時提供區域長度 不用0來標識字串或區域結束 以typd...
C 語言中如何盡量簡單地用 while 語句求 1 到 10 的階乘?
如果你的模數不是質數的話,請先拆成質數的整次冪。然後對於每乙個整次冪,用 exLucas 裡面提到的遞推方法解出在這一整次冪下的階乘結果。隨後只需要用 CRT 合併即可。由於題主沒有貼出模數,所以我沒法寫出更詳細的過程。 靜水流深MXY include intmain return0 墨黎 whil...
C 語言中如何優雅地拼接多段字串?
湛藍水晶 用sprintf strcat在設計之初是考慮了鏈式呼叫的,所以返回的是源位址,於是可以用 strcat strcat strcat strcat strcat strcat strcat strcat dest TEST1 ip TEST2 port TEST3 name TEST4 n...