C - Null Terminating char不会停止打印

时间:2017-11-17 12:59:13

标签: c strcat null-terminated

在这部分代码中:

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终止符不应该终止打印?

谢谢

编辑:

  1. 之前已经初始化了数据,我是从函数中获取的。

  2. 为什么不打印只有260?我该怎么办?

3 个答案:

答案 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);
  }

祝你好运。