最近在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 可以看成%[] 的一個特例 %[^ ](注意^後面有一個空格!)
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;
}