一、從stringstream轉換到cstring
在c++中,我們可以使用stringstream類型將數字轉換為字符串,例如:
string str_num = "123"; int num; stringstream ss(str_num); ss >> num;
但在實際使用中,我們可能需要將一個char數組或cstring類型的字符串轉換為int類型,我們可以採用類似的方法:
char cstr_num[] = "456"; int num; stringstream ss(cstr_num); ss >> num;
使用stringstream的好處是可以避免一些常見的錯誤,例如對於無法轉換的字符串,它可以返回0而不是隨機值,也不會退出程序,而且它可以自動忽略字符串中的非數字字符。
二、從sscanf轉換到cstring
sscanf是c語言中一個十分常見的函數,它可以將一個字符串解析成指定格式的不同類型的數據,例如:
char cstr_num[] = "789"; int num; sscanf(cstr_num, "%d", &num);
其中,”%d”是指定的格式控制字符。但是,當給定的字符串中出現非數字字符時,sscanf會將該字符作為一個數字處理,並導致程序錯誤。
為了避免這種情況,我們可以使用sscanf的一個非常有用的特性,即它返回成功讀取的數字的數量。
char cstr_num[] = "123abc"; int num; int count = sscanf(cstr_num, "%d", &num); if (count > 0) { // 轉換成功 } else { // 轉換失敗 }
三、使用strtod、strtol、strtoul、strtoll、strtoull等函數轉換
在c庫中,還有一些函數可以用來將字符串轉換為數字類型,它們的具體使用方法如下:
- strtod:將字符串轉換為double類型。
- strtol:將字符串轉換為long int類型。
- strtoul:將字符串轉換為unsigned long int類型。
- strtoll:將字符串轉換為long long int類型。
- strtoull:將字符串轉換為unsigned long long int類型。
這些函數可以傳入一個指向字符串的指針和指向一個指針的指針,後者用來指示輸出結果的開始位置。在這幾個函數中,strtod最為靈活,可以處理有小數點或指數的字符串。而其餘函數的用法都比較類似,以strtol為例:
char cstr_num[] = "987"; char* endptr; long int num = strtol(cstr_num, &endptr, 10); if (cstr_num == endptr) { // 轉換失敗 } else { // 轉換成功 }
其中參數10是指數字的進制,可以是2到36之間的任意值。如果設為0,strtoul就會根據字符串的前綴來判斷進制,如0x表示16進制,0表示8進制,其他則為10進制。
四、使用atoi、atol、atoll等函數轉換
這些函數使用起來非常簡單,直接傳入需要轉換的字符串即可,例如:
char cstr_num[] = "999"; int num = atoi(cstr_num);
但是這些函數非常的不安全,如果處理非數字字符,就會導致未定義的行為,因此在正式的代碼中應該避免使用它們。
五、完整代碼示例
以下代碼是一個完整的cstring轉int的示例:
#include <iostream> #include <sstream> using namespace std; int cstr_to_int(string str_num) { int num; stringstream ss(str_num); ss >> num; return num; } int cstr_to_int(char* cstr_num) { int num; stringstream ss(cstr_num); ss >> num; return num; } int main() { string str_num = "123"; char cstr_num[] = "456"; cout << "string to int: " << cstr_to_int(str_num) << endl; cout << "char array to int: " << cstr_to_int(cstr_num) << endl; return 0; }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/236014.html