天天看點

字元流(stringstream|sscanf|sprintf)stringstream: sscanf:sprintf:

stringstream:

顧名思義,字元串的流入流出。舉例分析:

#include <iostream>
#include <sstream>
#include <cstring>
using namespace std;

int main()
{
    string s1,s2;
    getline(cin,s1);//讀取字元直至遇到換行(可以讀取空格)
    stringstream s(s1);//注意使用的時候需要加頭檔案   #include <sstream>
    while(s>>s2&&s!='\0')
    cout<<s2<<endl;
    return 0;
}
           

運作結果:

字元流(stringstream|sscanf|sprintf)stringstream: sscanf:sprintf:

通過getline可以讀取一個包含空格的字元串,通過sstream把字元串按空格進行分割。 (注意使用的時候一定不要忘了頭檔案#include <sstream>)

sscanf:

具體用法舉例分析更容易說明:

#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{
    char s[15] = "123.432 432";
    double f1;
    int f2;
    sscanf(s, "%lf %d", &f1, &f2);
    cout<<f1<<" "<<f2;
    return 0;
}
           

運作結果:

字元流(stringstream|sscanf|sprintf)stringstream: sscanf:sprintf:

雖然都是相同的123.432 432 但是數值類型已經通過sscanf将字元串類型轉變為了一個double類型和一個int型的變量。 (注意使用時需要頭檔案#include <cstdio>)

應用:判斷合法ip,可以根據輸入的ip字元串來分割ip的值,代碼如下:

#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{
    char ip[20];
    cin>>ip;//ip的标準樣例:123.69.16.3
    int i1,i2,i3,i4;
    sscanf(ip, "%d.%d.%d.%d", &i1, &i2, &i3, &i4);//%d用.來隔開
    cout<<i1<<endl;
    cout<<i2<<endl;
    cout<<i3<<endl;
    cout<<i4<<endl;
    return 0;
}
           

運作結果:

字元流(stringstream|sscanf|sprintf)stringstream: sscanf:sprintf:

很顯然一個字元串已經被拆分成四個整形的數。但是要注意,這裡的ip必須是字元數組類型而不能是字元串類型。否則編譯器會報錯。這是因為函數傳入的參數就是字元數組類型而不是字元串類型,如果傳入的參數類型不同就無法調用sscanf。 除此之外的一個細節就是因為ip的是用小數點來隔開四個整數,是以在sscanf中%d之間的小數點是不可省略的。

sprintf:

簡單來說,就是将數值類型轉化為字元類型。舉例分析:

#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{
    char str[256] = {0};
    int data =1555;//%d 整數轉成十進位。%o 整數轉成八進位。%s 整數轉成字元串。%x 整數轉成小寫十六進位。%X 整數轉成大寫十六進位。
    sprintf(str,"%d",data);//str為字元類型的進位數
    printf("轉化為16進制的結果:%x\n",data);//進位數改變,數值類型不變
    cout<<"整形轉化為字元類型并将其拆分:"<<endl;
    for(int i=0; i<strlen(str); i++)
        cout<<str[i]<<endl;
    return 0;
}
           

運作結果:

字元流(stringstream|sscanf|sprintf)stringstream: sscanf:sprintf:

普通的printf裡面的%*,可以将其數值的進制改變而數值類型不變,sprintf不僅可以改變進制,而且将其轉變為字元類型,與sscanf相同的是 用到的都是字元數組而不是字元串。 除此之外sprintf還可以将兩個字元數組連接配接:

const char *s1 = "Hello";
    const char *s2 = "World";
    //連接配接字元串s1和s2
    sprintf(str,"%s %s",s1,s2);//s1 s2之間如果沒有空格則連接配接的字元串s1s2之間也沒有空格
           

學到新的會繼續補充。。。