【问题标题】:C - Null Terminating char doesnt stop printingC - 空终止字符不停止打印
【发布时间】:2017-11-17 12:59:13
【问题描述】:

在这部分代码中:

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

为什么会这样?空终止符不应该终止打印吗?

谢谢

编辑:

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

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

【问题讨论】:

  • data 尚未初始化
  • 您不需要手动附加空字符,strcat 已经这样做了,strcat(data, "\0"); 绝对什么都不做(更不用说字符串文字本身也是空终止的,所以它包含在这种情况下有两个空字符)。您需要做的是将data 初始化为可以保存所有这些值的东西。
  • 您可能需要阅读 C 教科书中处理字符串的章节。
  • 修复您的代码。请提供Minimal, Complete, and Verifiable example
  • @lurker 已编辑,抱歉!

标签: c strcat null-terminated


【解决方案1】:

您的代码存在 2 个关键问题。

首先,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");,因为strcatstrcpy 将确保data 正确地以NUL 终止。

【讨论】:

  • 即使我做 data[3]='\0',插入 260 后,它也不会改变任何东西..(不是“260\0130128”?)
  • @NickStavr 不是“260\0130128”你怎么知道?
  • @NickStavr 为什么会这样?如果data 包含“260\0” - 你添加“130”,它变成“260130\0”
  • 如果我将 data[3]='\0' 替换为 data[3]='!',则输出为 "260!130128"
  • @NickStavr \0 是字符串结束的地方,如果你用strcat 向它添加更多字符,结尾会移动。一种 '!'是常规字符,因此将成为字符串的一部分。尽管除非您还添加了data[4]='\0',否则您的字符串将未终止并导致问题。
【解决方案2】:

没有。 strcat 在追加之前删除尾随的 nul 字符。

参考http://www.cplusplus.com/reference/cstring/strcat/

将源字符串的副本附加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且在目标中由两者连接形成的新字符串的末尾包含一个空字符。

【讨论】:

    【解决方案3】:

    您需要使用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);
      }
    

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2014-04-08
      • 2012-06-07
      • 2012-01-02
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      相关资源
      最近更新 更多