C++字符串數字轉換以及字符串匹配處理

1. 字符串轉換爲數字

1.1. 簡單轉換

double atof(const char *string);
double _wtof(const wchar_t *string);
int atoi(const char *string);
__int64 _atoi64(const char *string);
int _wtoi(const wchar_t *string);
__int64 _wtoi64(const wchar_t *string);
long atol(const char *string);
long _wtol(const wchar_t *string);

1.2. 指定轉換基數

double strtod(const char *nptr,  char **endptr);
double wcstod(const wchar_t *nptr,  wchar_t **endptr );
unsigned __int64 _strtoui64(const char *nptr, char **endptr,  int base);
unsigned __int64 _wcstoui64(   const wchar_t *nptr,   wchar_t **endptr, int base );
long strtol(const char *nptr,  char **endptr,  int base );
long wcstol(const wchar_t *nptr,  wchar_t **endptr,   int base);
string = "0xa10110This stopped it";
string = "a10110This stopped it"; // 均可
long lVal = strtol(string, &stopstring, 16);

1.3. 字符串格式化轉換

char szFloat[]="123.321";
float fVal = 0.0;
sscanf_s(szFloat, "%f", &fVal);
char szDouble[] = "3.1415926535897";
double dVal = 0.0;
sscanf_s(szDouble, "%lf", &dVal);

2. 數字轉字符串

2.1. sprintf_s

char szVal[32] = {0};
unsigned _int64 val = 121222222222;
sprintf_s(szVal, sizeof(szTemp), "%llx", val);

2.2. CString.Format

CString strVal;
UINT uVal = 0x12345;
strVal.Format("%#.8x", uVal); // 0x00012345

3. 附字符串格式化表

類型 意義
%d 十進制有符號整型
%u 十進制無符號整型
%f 單精度浮點類型
%lf 雙精度浮點類型
%x 16整形
%s 字符串類型
%c 單個字符
%p 指針的值
%lld 64位十進制有符號整形
%llu 64位十進制無符號整形
%llx 64位十六進制整形

4. 格式化字符串形式

[標誌][輸出最小寬度][.精度][長度]類型

4.1. 標誌

    • 輸出符號(正號或負號)空格輸出值爲正時冠以空格,爲負時冠以負號
    • 結果左對齊,右邊填空格
  • # 對o類, 在輸出時加前綴。對x類,在輸出時加前綴0x。

4.2. 輸出最小寬度

用十進制整數來表示輸出的最少位數。 若實際位數多於定義的寬度,則按實際位數輸出, 若實際位數少於定義的寬度則補以空格或0。

4.3. 精度

精度格式符以“.”開頭,後跟十進制整數。本項的意義是:如果輸出數字,則表示小數的位數;如果輸出的是字符, 則表示輸出字符的個數;若實際位數大於所定義的精度數,則截去超過的部分。

4.4. 長度

例如: %6.9s 表示顯示一個長度不小於6且不大於9的字符串。若大於9, 則第9個字符以後的內容將被刪除。

5. 字符串處理

5.1. %[ ] 用法

%[ ]表示要讀入一個字符集合, 如果[ 後面第一個字符是”^”,則表示反意思。遇不到第一個不滿足要求的即停止截取字符串。*表示跳過當前的獲取。

char szVal[32] = {0};
char szSrc[]="HELLOkitty12349ABC";
sscanf_s(szSrc, "%[A-Z]", szVal, sizeof(szVal)); // szValue = HELLO,遇到小寫的k停止。
sscanf_s(szSrc, "%[A-Z,a-z]", szVal, sizeof(szVal)); // szValue = HELLOkitty,遇到數字1停止
sscanf_s(szSrc, "%[HEk]", szVal, sizeof(szVal)); // szValue = HE,遇到L不滿足集合要求停止。
sscanf_s(szSrc, "%[^a-z]", szVal, sizeof(szVal)); // szValue = HELLO,遇到k屬於小寫停止
sscanf_s(szSrc, "%[^1234]", szVal, sizeof(szVal)); // szValue = HELLOkitty,遇到數字1停止
sscanf_s(szSrc, "%*[A-Z]%s", szVal, sizeof(szVal)); // szValue = kitty12349ABC,跳過大寫字母
sscanf_s(szSrc, "%*[A-Z]%[a-z]", szVal, sizeof(szVal));// szValue = kitty,跳過大寫,只獲取小寫
// szValue = 12349,跳過所有字母,只要數字
sscanf_s(szSrc, "%*[A-Z]%*[a-z]%[1-9]", szVal, sizeof(szVal)); 
// szValue = ABC,跳過前面大寫,小寫,數字,然後獲取後面所有字符
sscanf_s(szSrc, "%*[A-Z]%*[a-z]%*[1-9]%s", szVal, sizeof(szVal));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章