淺談sscanf與sprintf

最近在C++編程中會遇到要進行字符串和整型之間相互轉換的情況,對於C++的字符流操作還不是很熟悉,而且感覺使用起來並沒有原來C語言中的sscanf與sprintf順手(個人對C++還不是特別熟練),所以還是習慣的使用了sscanf與sprintf來操作字符串。

sscanf和sprintf是scanf和printf家族的一對成員,用於處理和分析字符串非常強大得兩個函數。在C語言中使用這兩個函數的頭文件爲<stdio.h>,而在C++中爲<cstdio>,這是需要注意的一點不同。

1、sscanf

sscanf函數原型爲int sscanf(const char *str, const char *format, ...)。將參數str的字符串根據參數format字符串來轉換並格式化數據,轉換後的結果存於對應的參數內。具體功能如下:

(1)根據格式從字符串中提取數據。如從字符串中取出整數、浮點數和字符串等。

(2)取指定長度的字符串

(3)取到指定字符爲止的字符串

(4)取僅包含指定字符集的字符串

(5)取到指定字符集爲止的字符串

sscanf可以支持格式字符%[]:

(1)-: 表示範圍,如:%[1-9]表示只讀取1-9這幾個數字 %[a-z]表示只讀取a-z小寫字母,類似地 %[A-Z]只讀取大寫字母
(2)^: 表示不取,如:%[^1]表示讀取除'1'以外的所有字符 %[^/]表示除/以外的所有字符
(3),: 範圍可以用","相連接 如%[1-9,a-z]表示同時取1-9數字和a-z小寫字母 
(4)原則:從第一個在指定範圍內的數字開始讀取,到第一個不在範圍內的數字結束%s 可以看成%[] 的一個特例 %[^ ](注意^後面有一個空格!)

舉例1:C語言使用

const char *s = "http://www.baidu.com:1234";
char protocol[32] = { 0 };
char host[128] = { 0 };
char port[8] = { 0 };
sscanf(s,"%[^:]://%[^:]:%[1-9]",protocol,host,port);
printf("protocol: %s\n",protocol);
printf("host: %s\n",host);
printf("port: %s\n",port);

舉例2:C++使用

#include<iostream>
#include<string>
#include<cstdio>

using namespace std;

int main()
{
    string s1,s2,s3;
    char sa[100],sb[100],sc[100];
    sscanf("abc 123 wcd","%s%s%s",sa,sb,sc);
    s1 = sa;
    s2 = sb;
    s3 = sc;
    cout << s1 << " " << s2 << " " << s3 << endl;

    //將字符串分離成數字,分隔符爲',''$'
    int a,b,c;
    sscanf("4,5$6","%d,%d$%d",&a,&b,&c);
    cout << a << " " << b << " " << c << endl;
    return 0;
}


2、sprintf

sprintf函數原型爲 int sprintf(char *str, const char *format, ...)用於格式化字符串。把變量打印到字符串中,從而獲得數字的字符形式,這樣不需要手工轉換。

具體功能如下所示:

(1)將數字變量轉換爲字符串。

(2)得到整型變量的16進制和8進制字符串。

(3)連接多個字符串。

舉例如下:

char str[256] = { 0 };
int data = 1024;
//將data轉換爲字符串
sprintf(str,"%d",data);
//獲取data的十六進制
sprintf(str,"0x%X",data);
//獲取data的八進制
sprintf(str,"0%o",data);
const char *s1 = "Hello";
const char *s2 = "World";
//連接字符串s1和s2
sprintf(str,"%s %s",s1,s2);
注:

(1)在C++中有經常使用的string標準類型,而sscanf與sprintf的參數爲char *,因此如果需要對string類型使用上面兩個函數,參數要爲string.c_str();

(2)sscanf將char *拆分爲const char *,因此拆分string成string類型時,需要利用char []來進行中轉,舉例如下所示:

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    string s = "http://www.baidu.com:1234";
    string s1;
    char protocol[20];
    char host[20];
    char port[20];
    sscanf(s.c_str(),"%[^:]://%[^:]:%[1-9]",protocol,host,port);
    printf("protocol: %s\n",protocol);
    printf("host: %s\n",host);
    printf("port: %s\n",port);
    s1=protocol;
    cout<<s1<<endl;
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章