字符串序列化神器《sscanf》《sprintf》的使用 C++11《to_string》

本文介绍了C语言中sprintf、sscanf和to_string函数。sprintf可将不同类型数据序列化写入字符串,使用时要注意覆盖问题;sscanf用于从字符串读取格式化输入;to_string能将数值转化为字符串。掌握这些函数对解决字符串问题有很大帮助。

sprint

头文件:#include<stdlib.h>
C 库函数 int sprintf(char *string, char *format [,argument,…]);
用途:
该函数可以将不同类型的多个数据序列化的写入一个字符串buff中,比起strcat(连接两个字符串)函数将会是更加的方便快捷。
返回值 int :
该函数的返回值为int,写入成功时,返回的是写入的buff的字符个数。写入失败时返回一个负数。

参数列表:
string– 这是指向一个字符数组的指针,该数组存储了 C 字符串。
format– 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是%[flags][width][.precision][length]specifier
[argument]….:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。这里与我们使用scanf,printf的情景是一样的,即(“%d %s ”,int,string)的写入形式。
例如:


	char str[100]; 
	int j;//记录返回值 
	j=sprintf(str,"%s","hello");//将hello写入字符串str中。
	printf("%s\n	j=%d\n",str,j);
	
	j=sprintf(str,"%d",10);//将整数10以字符串得形式写入str中。
	printf("%s\n	j=%d\n",str,j);
	
	j=sprintf(str,"%d%s",10,"hello");//将字符串hello 和整数10按顺序写入str中
	printf("%s\n	j=%d",str,j);
	return 0;

运行结果:
在这里插入图片描述
覆盖问题
由上面的运行结果可以看出,sprintf可以很便捷的将不同类型的数据以字符串的形式写入一个字符串中,
我们分析一下上面的结果:
第一次写入hello:str=“hello”;
第二次写入10:str=“10”;
第三次写入10hello: str=“10hello”;
可以看出每一次的写入都覆盖了原来字符串中的数据。

注意:
将多个数据写入一个字符串时应注意覆盖问题。尽量一次性写入,分开写入时不细心就可能出现覆盖问题。例:

int main()
{
//一次性写入
	char str[100]; 
	int i=10;
	float f=1.234;
	char* s="hello";
	
	sprintf(str,"%d%f%s",i,f,s);//将多个数据同时写入str
	printf("%s",str);
	
	return 0;
 } 

结果为:
在这里插入图片描述

int main()
{
//正确的分开写入
	char str[100]; 
	char* s="hello";
	int i=10,j;//记录返回值 
	float f=1.234;
	j=sprintf(str,"%d",i);//将hello写入字符串str中。
	
	j+=sprintf(str+j,"%f",f);//将整数10以字符串得形式写入str中。
	
	j+=sprintf(str+j,"%s",s);//将字符串hello 和整数10按顺序写入str中
	
	printf("%s",str);
	return 0;
 } 

结果为:
在这里插入图片描述
分开写入时出错的情景:

str最终被覆盖为“hello”,与预期结果不同。

sscanf

c库函数 int sscanf(const char *str, const char format, …) 从字符串读取格式化输入。
用途:
从一个字符串读取格式化的输入。
参数:
str – 这是 C 字符串,是函数检索数据的源。
format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。
format 说明符形式为 [=%[
][width][modifiers]type=]
返回值int:
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
这里我们通过下面的例子具体说明下该函数的用法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   int day, year;
   char weekday[20], month[20], dtm[100];

   strcpy( dtm, "Saturday March 25 1989" );
   int i= sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );

   printf("%s %d, %d = %s\n", month, day, year, weekday );
    printf("成功赋值个数:%d",i);
   return(0);
}

运行结果:
在这里插入图片描述
以上就是sscanf与sprintf的具体用法,掌握了这两个函数将对我们解决字符串方面的问题有巨大的便利,我们要灵活使用。

to_string

函数原型:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);

功能:

将数值转化为字符串。返回对应的字符串。
例子:

#include <iostream>   
#include <string>     
using namespace std;

int main()
{
    string pi = "pi is " + std::to_string(3.1415926);
    string perfect = to_string(1 + 2 + 4 + 7 + 14) + " is a perfect number";
    cout << pi << '\n';
    cout << perfect << '\n';
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值