1. 程式人生 > >C/C++格式化輸入,輸出

C/C++格式化輸入,輸出

C/C++格式化輸入,輸出

1.C語言

1. 語言函式

scanf();
printf();
sscanf()   --> 不安全   
sscanf_s() ---> 安全 
sprintf()  --> 不安全 ----> sprintf_s()

2. 說下遇到的坑

string s1,s2;
int i=0;
sscanf(dest,"%d,%s,%s",&i,s1,s2); //-->如果時這樣寫的會 編譯可以會過,但是在執行的時候就會出現異常。
/* 所以在寫的時候就要寫C語言的型別,char* 其次該函式是不安全的函式,所以在使用的時候使用sscanf_s(),
sprintf()函式也是一樣的問題,應該使用sprintf_s()函式
*/

2.C++

  1. 利用stringstream 流進行處理,安全
    stringstream 中包含istringstream (輸入)、ostringstream(輸出)
  2. stringstream 流出時遇到 逗號,回車時問題
    string s = "1 1.3 aaa a ";
    string s1 = "abc,1,abcdef,abcdefg,aab";
    stringstream ss;
    ss << s;
    int ia = 0;
    double db = 0.0;
    string sc = "";
    char cd = ' ';
    
    ss >> ia;
    cout << "ia -> " << ia << endl;
    
    ss >> db;
    cout << "db -> " << db << endl;

    ss >> sc;
    cout << "sc -> " << sc << endl;

    ss >> cd;
    cout << "cd -> " << cd << endl;

    ss.clear();
    cout << "*****************************" << endl;

    ss << s1;
    //ss >> sc;
    //cout << sc << endl;
    while(ss >> sc) {cout << sc << endl;}

結果:

3.利用stringstream型別轉換

可以把任意型別轉換成字串

    template<class T>
    void to_string(string & s;T &val)
    {
        stringstream ss << val;
        s = ss.str();
    }

4.C++格式化

1.cin >> noskipws -- > 不忽略任意地方空格
2.hex控制輸出的格式,預設為dec(十進位制),可手動設定dec,hex,oct。
3.setiosflags為控制格式,ios::uppercase 為輸出大寫十六進位制格式,也可以省略setiosflags直接寫uppercase.一共有7種格式

    setiosflags(ios::fixed) --- 固定的浮點顯示
  setiosflags(ios::scientific) --- 指數表示
  setiosflags(ios::left) ---左對齊
  setiosflags(ios::right) ---右對齊
  setiosflags(ios::skipws) --- 忽略前導空白
  setiosflags(ios::uppercase) --- 16進位制數大寫輸出
  setiosflags(ios::lowercase) ---16進位制數小寫輸出