【问题标题】:confusion in output of C program for concatenation of two strings连接两个字符串的 C 程序输出混淆
【发布时间】:2019-03-29 16:26:20
【问题描述】:

这是我将字符串 2 附加到字符串 1 的代码。当我添加以下行时,代码工作正常:s1[null_index]='\0'; 但是当我省略它时,它会在输出中再添加一次“道路”一词……这是为什么呢?为什么我必须指定 null_index 变量的最终值为'\0'....计算机是否应该已经知道这一点,因为它在我一开始声明和分配时就知道了?

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
char s2[]="a lonely road";
char s1[]="Success is ";
    int l=strlen(s1);
    int null_index=l,i=0;
while(s2[i]!='\0')
{

s1[null_index]=s2[i];
i++;
null_index++;
}
s1[null_index]='\0'; 
printf("%s",s1);
}

【问题讨论】:

  • 对不起。你的程序完全错误。您正试图在没有为您分配内存的情况下写出s1 的“结尾”。你的实际问题? C 中的字符串必须以 0 结尾。
  • 你需要学习如何缩进你的代码。查看 C 教科书中的示例。

标签: c output concatenation string-concatenation


【解决方案1】:

开始
char s2[]="a lonely road";
char s1[]="Success is ";

将声明 s2 的大小为 14,s1 的大小为 12。因此,当您向 s1 写入超过 12 个字符时,您将调用未定义的行为。

改成。

char s1[100]="Success is ";

回答你的问题。

c 中,字符串由定义终止(\0)。因此printf 将在提供的字符串中查找\0 以终止string 的打印。

如果string 不包含\0 字符,它将继续打印字符,直到找到最终调用未定义行为的字符。

【讨论】:

    【解决方案2】:

    s1 分配的内存仅与Success is 所需的一样多,当您尝试执行s1[null_index]=s2[i]; 时,您会引发未定义的行为。

    【讨论】:

      【解决方案3】:

      问题是您拥有的数组是固定大小的。初始化后,任何超出空终止符的索引都将超出范围并导致undefined behavior

      如果要追加到s1,则需要显式设置数组的大小,该大小适合两个字符串(加上终止符)。

      当您追加到s1 时,循环的第一次迭代会覆盖终止符。由于您不复制 s2 的终止符,因此您必须在适当的位置显式设置 s1 的终止符。

      【讨论】:

      • 所以如果我设置一个适合两个字符串的大小...比如 100...那么这意味着 '\0' 将自动添加到末尾,对吗?另一方面,如果我没有像这样指定大小,那么计算机将不知道 '\0' 在哪里,因为它已被覆盖。我的理解对吗?
      • @AnasAziz 将“自动”添加终止符,因为在初始化时,数组中未使用的部分将被初始化为零。但总是自己显式添加终止符是一个好习惯。
      猜你喜欢
      • 1970-01-01
      • 2019-06-28
      • 2018-08-21
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      相关资源
      最近更新 更多