C語言中怎樣最好地從標準輸入流中獲取字串,並轉換為int陣列?

時間 2021-06-08 20:06:57

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...