C++中字元和數字之間的轉換
文章目錄
-
- C++中字元和數字之間的轉換
-
- sscanf 與 sprinf
- stringstream的使用
- 調用stoi stol 等庫函數
最近遇到看書和做題遇到的一些關于字元串和數字轉化之間的問題,做一個整理。
sscanf 與 sprinf
具體可以參考《算法筆記》p53頁
-
的使用sscanf
是将字元數組的内容以對應數字形式(也可以是字元串的形式, 本篇主要讨論字元與數字的轉化)傳輸到n中(從左到右),例如:sscanf
不同類型變量的組合:#include <cstdio> int main(){ int n; char c[100] = "8160"; sscanf(c, "%d", &n); printf("%d", n / 2); // 4080 /* char c[100] = "8160", t[20]; sscanf(c, "%s", t); printf("%s", t); // 8160 */ return 0; }
出現符号時#include <cstdio> int main(){ int n; double f; char c[100] = "abcde8160 13.1", t[20]; sscanf(c, "%5s %d %lf", t, &n, &f); printf("%s %d %.1f", t, n / 2, f); // abcde 4080 13.1 return 0; }
或者配合正規表達式#include <cstdio> int main(){ int n; double f; char *c = "abcde:8160,13.1", t[20]; sscanf(c, "%5s:%d,%lf", t, &n, &f); printf("%s %d %.1f", t, n / 2, f); // abcde 4080 13.1 return 0; }
使用對應的正規表達式,參考文章。#include <cstdio> int main(){ int n; double f; char c[100] = "abcde8160asdf13.1", t[20]; /* 寫成指針類型也可以,本質一樣 char *c = "abcde8160asdf13.1"; */ sscanf(c, "%5s %d %*[a-z]%lf", t, &n, &f); printf("%s %d %.1f", t, n / 2, f); // abcde 4080 13.1 return 0; }
%*xxx 忽略比對到的内容,後面的XXX是比對的模式,即跳過這些 %[xxx] [ ]這是類正規表達式的基本形式,xxx裡面就是它的比對模式 %[a-z] 比對所有的小寫字元,直到遇到不是小寫字元 %[0-9] 比對所有的數字,直到遇到不是數字 %[A-Z] 比對所有的大寫字元,直到遇到不是大寫字元 %[a-zA-Z] 比對所有的字元,直到遇到不是字元 %[^xxx] 比對字元,直到xxx出現 %[^a-z] 比對所有的字元,直到遇到小寫字元 %[^0-9] 比對所有字元,直到遇到數字 %[^#] 比對所有字元,直到遇到#
-
功能正好相反,是将n以對應形式的的數字(也可以是字元串的形式,本篇主要讨論字元與數字的轉化)寫到字元數組中(從右到左),例如:sprintf
不同類型變量的組合#include <cstdio> int main(){ int n = 8160; char c[50]; sprintf(c, "%d", n); printf("%s", c); // 8160 /* int n; char c[20], a[20] = "8160", b[20] = "4152"; sprintf(c, "%s%s", a, b); printf("%s", c); // 81604152 */ return 0; }
實作中間位置的拼接#include <cstdio> int main(){ int n = 8160; double f = 3.14159; char c[20], a[20] = "abcd"; sprintf(c, "%d%.3f%s", n, f, a); printf("%s", c); // 8160 3.142 abcd /* 如果中間存在 空格 sprintf(c, "%d %.3f %s", n, f, a); 輸出為:8160 3.142 abcd 同理中間的位置就可以連接配接其他的字元 如abc */ return 0; }
設定拼接字元寬度:#include <cstdio> int main(){ int n = 8160; double f = 3.14159; char c[20], a[20] = "abcd"; sprintf(c, "%dadc%.3f11%s", n, f, a); printf("%s", c); // 8160adc3.14211abcd return 0; }
sprintf的用法很多,具體參考此篇,之後擁抱再繼續補充。#include <cstdio> int main(){ int a = 8160, b = 123; char c[20]; sprintf(c, "%6d%6d", a, b); printf("%s", c); // 8160 123 return 0; }
stringstream的使用
- 字元串轉化為數字
#include <iostream> #include <sstream> using namespace std; int main(){ stringstream ss; string s = "8160"; int n; ss << s; ss >> n; cout << n; return 0; }
- 數字轉為字元串
#include <iostream> #include <sstream> using namespace std; int main(){ stringstream ss; int a = 81060; string c; ss << a; ss >> c; // 或 c = ss.str(); cout << c; return 0; }
stringstream
還有其他的用法,日後總結。
調用stoi stol 等庫函數
-
string 與數字之間的轉換, 一般的後兩個參數可以 p,b是可選項,一般不需要的時候可以不寫。 參考官方 文檔
s為要轉化的字元串
pos 為起始位置
base對應的進制
示例:函數 含義 stoi(s, pos, base) 需要轉化為int類型的字元串s,p為起始位置,b為對應的進制 stol(s, pos, base) 需要轉化為long類型的字元串s,p為起始位置,b為對應的進制 stoll(s,pos, base) 需要轉化為long long類型的字元串s,p為起始位置,b為對應的進制 stoul(s,pos,base) 需要轉化為unsigned long 類型的字元串s,p為起始位置,b為對應的進制 stoull(s,pos,base) 需要轉化為unsigned long long 類型的字元串s,p為起始位置,b為對應的進制s stof(s,pos) 需要轉化為float 類型的字元串s,p為起始位置 stod(s,pos) 需要轉化為double 類型的字元串s,p為起始位置 stold(s,pos) 需要轉化為long double類型的字元串s,p為起始位置 to_string(v) 數字轉化為字元轉 #include <iostream> using namespace std; int main(){ int n = 100; cout << to_string(n) << endl; string s = "16"; cout << stoi(s) << endl;; return 0; }
- char 數組和數字之間的轉化 示例:
函數 含義 atoi© char類型的字元串轉化為int類型值 atof© char類型的字元串轉化為float類型值 atol© char類型的字元串轉化為long類型值 #include <iostream> using namespace std; int main(){ char c[20] = "8160"; cout << atoi(c) / 2; return 0; }
其他的就日後補充啦~