【问题标题】:Cant add characters to a char pointer assigned to ""无法将字符添加到分配给“”的字符指针
【发布时间】:2020-08-09 09:59:55
【问题描述】:

假设我有这个代码

char *string = "";
string += 'A';
string += 'B';
string += 'C';
printf("%s\n", string);

它只是打印一个空行。为什么要这样做,如果我不知道它会持续多长时间,是否有一种简单的方法可以连接从空字符串开始的单个字符?

【问题讨论】:

  • string += 'A'; 错误的原因有很多。你需要做的是查看mallocrealloc(完全忘记使用+=
  • 连接两个字符串使用strcat,如果要逐个字符设置字符串,从足够大的缓冲区开始,并逐个设置每个字符
  • 你来自 Java 吗?
  • @UnholySheep 我已将其更改为在 char 指针上使用 calloc。既然我有了,我该如何设置分配给我正在阅读的字符的不同内存地址?
  • @Jens 是的,我来自 Java

标签: c pointers char append c-strings


【解决方案1】:

在这样的陈述中

string += 'A';

这里用到了指针算法。将字符“A”的内部表示的值添加到指针 string 的值中,结果指针具有无效值,因为它没有指向实际对象。

例如需要声明一个字符数组

char string[4] = "";

然后您可以将数组的各个元素设置为字符文字,例如

int i = 0'
string[i++] = 'A';
string[i++] = 'B';
string[i++] = 'C';
string[i] = '\0';

printf("%s\n", string);

另外你在这个电话中有一个错字

printf("&s\n", string);

如果一个字符数组已经包含一个类似的字符串

char string[4] = "AB";

如果您想在字符串末尾附加一个字符,那么您可以使用字符文字进行编写

size_t n = strlen( string );
string[n] = 'C';
string[n + 1] = '\0';

或者您可以使用字符串文字和标准 C 函数 strcat 之类的

strcat( string, "C" );

在任何情况下,字符数组都应该有足够的空间来容纳一个新字符。

【讨论】:

  • @chqrlieforyellowblockquotes 谢谢。这是由于复制和粘贴。
  • 谢谢。这看起来像我需要的。另外,很抱歉错字。它不在我的代码中,只是在我的问题中。
【解决方案2】:

string 只是一个指向字符串文字"" 的指针,因此当您将char+ 添加时,您实际上只是在移动指针而不是连接到字符串。在 C 中,您可以分配一个足够大的字符串并使用strcat 向其中添加字符串:

char string[100] = "";
strcat(string, "A");
strcat(string, "B");
strcat(string, "C");
printf("%s\n", string);

如果你想使用字符,那么你可以先convert the char to a string

【讨论】:

    【解决方案3】:

    string += 'A'; 确实 将字符附加到字符串中,它会将 char 指针 string 增加 'A' 的值,在使用 ASCII 的系统上为 65 并使 @ 987654325@ 点远远超出"" 字符串文字的末尾。因此,此代码具有未定义的行为。

    printf("&s\n", string); 应该打印 &s 和一个换行符。

    假设您在问题中输入了错误的代码,printf("%s\n", string); 会出现未定义的行为,并且可能会打印空行,以及崩溃或任何其他令人讨厌的副作用。

    如果你想一次构造一个字符串,使用这个:

    char buf[20];
    char *string = buf;
    *string++ = 'A';
    *string++ = 'B';
    *string++ = 'C';
    *string = '\0';    // set the null terminator
    printf("%s\n", buf);
    

    相反,您可以将strcat 与字符串文字一起使用:

    char string[20] = "";
    strcat(string, "A");
    strcat(string, "B");
    strcat(string, "C");
    printf("%s\n", string);
    

    【讨论】:

      【解决方案4】:

      它只是打印一个空行。

      你很不幸,但并不奇怪,你的代码的未定义行为表现为打印一个明显为空的字符串。如果它引发了段错误或其他各种与内存相关的违规行为,这将更能表明问题的性质,这将是完全合适的。

      为什么会这样

      因为您是在指针上执行算术运算,而不是修改它所指向的东西。这句话……

      string += 'A';
      

      ...计算string与整数字符常量'A'(其数值取决于系统,但通常是大写字母A的ASCII码)的指针相加,并将结果指针存储在@987654324中@。这使得string 指向与以前不同的东西。它不会以任何方式修改string 指向的内存内容。

      有没有简单的 连接从空字符串开始的单个字符的方法 if 不知道要多久?

      如果您对数据的长度有上限,那么最简单的做法是声明一个足够大的数组来包含数据并将其初始化为全零。 .

      char string[MAX_LEN + 1] = {0};
      

      然后,您可以通过将单个字符写入下一个可用索引来添加单个字符(您可以跟踪该索引,或通过strlen() 按需计算):

      unsigned next_index = 0;
      
      string[next_index++] = 'A';
      string[next_index++] = 'B';
      string[next_index++] = 'C';
      

      请注意,这依赖于零初始化——这对于局部变量来说不是自动的——以确保数组内容始终包含一个 null-terminated 字符串。完成后,您可以打印预期的结果:

      printf("%s\n", string);
      

      如果您事先不知道字符串长度的合理上限,或者上限非常大,那么您将需要依赖动态内存分配和重新分配。这是您推迟到以后的主题。

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多