sprintf 函数详解

sprintf 介绍

在这里插入图片描述
printf函数大家都熟悉,但是printf一般打印到标准输出,在需要整理、格式化字符串时,sprintf就大显身手了。
例如,在处理传感器数据时,为了将得到的数据整合成特定的格式通过网络发送出去,

char buffer[100] = { 0 };
sprintf(buffer, "temperature: %f; humidity:%f\r\n", tempData, humiData);
send(clientSocket, buffer, strlen(buffer));

又例如,在进行HTTP协议包封装时,

char dataBuf[1024] = { 0 };
 
sprintf(dataBuf, "HTTP/1.1 200 SUCCESS\r\n");
send(clientSocket, dataBuf, strlen(dataBuf), 0);
 
sprintf(dataBuf, "Content-type:text/html\r\n");
send(clientSocket, dataBuf, strlen(dataBuf), 0);
 
sprintf(dataBuf, "\r\n");
send(clientSocket, dataBuf, strlen(dataBuf), 0);
 
do
{
	fgets(dataBuf, 1024, fs);
	send(clientSocket, dataBuf, strlen(dataBuf), 0);
} while (!feof(fs));
 
fclose(fs);

sprintf语法:

int sprintf(char *string, char *format [,argument,…]);
·string:指向字符数组的指针,该数组存储了C字符串。
·format:格式化的字符串
·argument:根据语法格式替换format中%标签
语法是相当简单的,但是有个需要注意的点,sprintf是将format指向的字符串从string[0]的位置依次放入(覆盖),当format指向的字符串长度比string字符数组小时,string数组中未被覆盖的值将保持,看下面的例子,

char sendBuf[1024] = { 0 };
 
sprintf(sendBuf, "HTTP/1.1 404 NOT FOUND\r\n");
send(clientSocket, sendBuf, strlen(sendBuf), 0);
printf("The sent string1 is:%s\r\n", sendBuf);
 
sprintf(sendBuf, "Content-type:text/html\r\n");
send(clientSocket, sendBuf, strlen(sendBuf), 0);
printf("The sent string2 is:%s\r\n", sendBuf);
 
sprintf(sendBuf, "\r\n");
send(clientSocket, sendBuf, strlen(sendBuf), 0);
printf("The sent string3 is:%s\r\n", sendBuf);
 
printf("The other char 0 is:%c\r\n", sendBuf[0]);
printf("The other char 1 is:%c\r\n", sendBuf[1]);
printf("The other char 2 is:%c\r\n", sendBuf[2]);
printf("The other char 3 is:%c\r\n", sendBuf[3]);
printf("The other char 4 is:%c\r\n", sendBuf[4]);
printf("The other char 5 is:%c\r\n", sendBuf[5]);
printf("The other char 6 is:%c\r\n", sendBuf[6]);

输出如下:
在这里插入图片描述
如上代码,最后一次使用sprintf将sendBuf字符串数组格式化为"\r\n",这时逐项打印sendBuf,

sendBuf[0]的值为\r,所以看不到该项打印

sendBuf[1]的值为\n,所以看不到该项打印,但是产生了换行动作

sendBuf[2]的值为"“,就是字符串最后的”\0",所以看不到打印

sendBuf[3]的值为t,这是上一次格式化遗留的字符

sendBuf[4]的值为e,这是上一次格式化遗留的字符

sendBuf[5]的值为n,这是上一次格式化遗留的字符

sendBuf[6]的值为t,这是上一次格式化遗留的字符

在如上代码的上下文中,sendBuf中遗留的上次格式化的字符不会对程序运行产生任何影响,因为使用send发送字符串时,指定了发送长度为strlen(sendBuf),因此sendBuf字符数组中被发送的只是刚拷贝来的新数据。但是如果将strlen更换为sizeof,程序功能便会出现异常。

在使用sprintf前,有时需要保证目标字符串数组“干净”,可以使用memset实现。

如memset(sendBuf, 0, sizeof(char) * 1024)。
参考:https://blog.csdn.net/qq_37253168/article/details/120184412

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值