浅谈sscanf与sprintf

1 篇文章 0 订阅

最近在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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值