在这部分代码中:
char* data;
char num[10];
sprintf(num, "%d", 260);
strcat(data, num);
strcat(data, "\0");
sprintf(num, "%d", 130);
strcat(data, num);
sprintf(num, "%d", 128);
strcat(data, num);
printf("Data: %s", data);
它的印刷:
Data: 260130128
为什么会这样? null终止符不应该终止打印?
谢谢
编辑:
之前已经初始化了数据,我是从函数中获取的。
为什么不打印只有260?我该怎么办?
答案 0 :(得分:5)
您的代码存在两个关键问题。
首先,data
尚未初始化。它只是指向内存中的一些随机点。您应该使用malloc
char *data=malloc(200);
或者只是将其声明为像您一样使用num
完成的数组。
char data[200];
其次,当您首次strcat
进入data
时,它不会终止NUL,因此您可能会潜在地附加到随机垃圾数据中。您可以将strcat
替换为strcpy
(这是最有意义的)
strcpy(data, num);
或确保data[0]
等于\0
data[0]='\0';
strcat(data,num);
您不需要strcat(data, "\0");
作为strcat
,而strcpy
将确保data
正确终止NUL。
答案 1 :(得分:3)
没有。 strcat
在追加之前删除尾随的nul字符。
参考http://www.cplusplus.com/reference/cstring/strcat/
将源字符串的副本附加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且在由目标中的两个串联形成的新字符串的末尾包含空字符。
答案 2 :(得分:0)
您需要使用strcpy
在现有数据+ NUL之后将子字符串复制到缓冲区中。因为您基本上将多个字符串放入缓冲区,所以您必须自己跟踪缓冲区中数据的总长度:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char data[100] = "";
char num[10];
int data_len = 0;
sprintf(num, "%d", 260);
strcpy(data+data_len, num);
data_len += strlen(num)+1;
sprintf(num, "%d", 130);
strcpy(data+data_len, num);
data_len += strlen(num)+1;
sprintf(num, "%d", 128);
strcpy(data+data_len, num);
data_len += strlen(num)+1;
printf("data_len = %d\n", data_len);
printf("Data: %s\n", data);
}
祝你好运。