最近做專案,需要用到字串轉整型,因為字串是有可能任意的,所以轉整型的時候要先對字串進行判斷。
網上所用的字串轉整型大概有:atoi ,正規表示式,stoi, sscanf等等。
atoi 原型:
int atoi(const char *nptr);
引數nptr字串,如果第乙個非空格字元存在,是數字或者正負號則開始做型別轉換,之後檢測到非數字(包括結束符 \0) 字元時停止轉換,返回整型數。否則,返回零。
atoi的乙個比較麻煩的缺點是,它是錯誤返回零的,當輸入的字串為空,或者是「0000」、「-000000」、「+0000」時它無法區分,這就要求我們在輸入之前對字串進行過濾,至今我沒想到比較好的方法可以解決這個問題。
正規表示式:
c++正規表示式的使用需要加入
#include 標頭檔案,下面的是乙個用法,判斷是否符合郵箱格式:
bool is_email_valid(const std::string& email)
網上的c++正規表示式的用法很多,詳細可以檢視
而我們的string to int的正規表示式大概有這幾種(自己沒很認真的學過,不知道裡面有沒有錯誤的地方,但是執行了第乙個,結果是正確的)
(@"^[+-]?/d*$");
(@"^[+-]?/d*[.]?/d*$");
( @"^/d*[.]?/d*$");
正規表示式能比較好的達到我們需要的目的,而且**邏輯也相當簡單,但是不夠完美的地方是,它造成的開銷會比較大,相對於stoi、atoi和sscanf,它的開銷是其它開銷的幾倍,當然,如果對效能要求不高的話,我推薦是使用這個。而我自己所做的東西對效能要求比較高,所以最後沒有採納這種方法。
stoi 原型:
int stoi( const string& _str, size_t *_idx = 0, int _base = 10 );stoi同atoi差不多,返回也是乙個整型數,第二個引數_idx返回時包含首個未轉換字元的索引,所以可以利用第二個引數來過濾掉「123abc」或者「12 789」(中間有空格)這種情況,轉換後判斷下_idx是否指向原來字串的結尾即可,例子如下:
string str;
size_t index;
intvalue = stoi(str, &index);
if (index != str.size())
return false;
但是stoi並沒有提供錯誤返回值,當字串無法轉化為整型時(比如str為「」,「abc」等),stoi會丟擲系統的物件(throws an object ),也就是乙個記憶體錯誤彈窗,這使人非常頭疼,於是得事先加個判斷,判斷string的頭兩個字元是否為數字字元或者「+ -」加數字字元。
sscanf 原型:
int sscanf(
const char *buffer,
const char *format [,
argument ] ... );
sscanf從字串中讀取格式化資料,每個函式返回成功轉換並分配的字段數量;返回值不包括已讀取但未分配的字段。
返回值為 0 表示未分配字段。
如果出現錯誤,或者,如果在第乙個轉換之前到達字串的末尾,則返回值是 eof。
用法跟scanf有點像,只不過將控制台的流輸入換成乙個字串const char* buff而已,我的做法如下:
result = sscanf(str, "%d%c", &intvalue, &endchar);
if (endchar != '\0' || result < 1)
這種方法主要是判斷,str中能轉換為整數的部分的下乙個字元是否是"\0",如果非,則意味則str字串中還有其他非數字字元,原字串不是純數字字串。sscanf的方法也可以用來判斷原字串是不是純數字字串。
其他的string to int的方法還有很多,比如sprintf、stringstream等等,詳細可以看:
由於功力還不夠,其中絕對有不對或者遺漏的地方,歡迎指正。
整型轉字串
專案中要用到檔案操作輸出一些結構體資訊,包括一些int型的數字,為了直觀,需要轉換成字串,雖然c語言提供了這種函式,但還是想自己從底層造個輪子。思路 把int的位數記住,申請位數加1的記憶體 多乙個存 0 把每乙個數字轉換成字元存入。整型轉字串.cpp 此檔案包含 main 函式。程式執行將在此處開...
字串(任意進製)轉整型
問題描述 該題目是對一般的字串轉整型函式的提公升。該題目可以擴充套件對任意進製的字串,轉換成整型值。比如 我們知道以0開頭的為八進位制,以0x開頭的為十六進製制。在這裡我們還可以規定以其他符號開頭的字串為某進製,比如 規定以 開頭的為二進位制等等。我們需要做的就是將這些不同進製的字串,轉換成相應的整...
stringsteam使用之整型轉字串
最近需要用到整型轉字串的操作,學習了stringstream一些皮毛。首先需要包含標頭檔案。include 然後用流操作的方式將值傳遞給stringstream物件ss。而ss.str 即為轉換的字串。stringstream ss if n 1 return ret for int i 1 i n...