天天看點

C++中字元串和數字之間的轉換

C++中字元和數字之間的轉換

文章目錄

    • C++中字元和數字之間的轉換
      • sscanf 與 sprinf
      • stringstream的使用
      • 調用stoi stol 等庫函數

最近遇到看書和做題遇到的一些關于字元串和數字轉化之間的問題,做一個整理。

sscanf 與 sprinf

具體可以參考《算法筆記》p53頁

  1. sscanf

    的使用

    sscanf

    是将字元數組的内容以對應數字形式(也可以是字元串的形式, 本篇主要讨論字元與數字的轉化)傳輸到n中(從左到右),例如:
    #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] 比對所有字元,直到遇到數字
    %[^#] 比對所有字元,直到遇到#
               
  2. sprintf

    功能正好相反,是将n以對應形式的的數字(也可以是字元串的形式,本篇主要讨論字元與數字的轉化)寫到字元數組中(從右到左),例如:
    #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;
    }
               
    設定拼接字元寬度:
    #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;
    }
               
    sprintf的用法很多,具體參考此篇,之後擁抱再繼續補充。

stringstream的使用

  1. 字元串轉化為數字
    #include <iostream>
    #include <sstream>
    using namespace std;
    int main(){
        stringstream ss;
        string s = "8160";
        int n;
        ss << s;
        ss >> n;
        cout << n;
        return 0;
    }
               
  2. 數字轉為字元串
    #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 等庫函數

  1. 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;
    }
               
  2. 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;
    }
               

其他的就日後補充啦~