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)
。