【问题标题】:how to overcome undefined behavior in strings concatenation?如何克服字符串连接中的未定义行为?
【发布时间】:2020-10-15 02:54:30
【问题描述】:

我想在 c 中连接字符串。于是我写了如下代码:

#include <stdio.h>
#include <string.h>


int main () {
    char str1[20], str2[20];
    int i=0;
    
    scanf("%20s",str1);
    getchar();
    scanf("%20s",str2);
    getchar();
    char str3[strlen(str1)+strlen(str2)];

    for(i=0; str1[i]; i++){
        str3[i]=str1[i];
    }
    
    for(i=0; str2[i]; i++){
        str3[strlen(str1)+i]=str2[i];
    }
    
    printf("\nSum is: %s\n", str3);
    
    return 0;
}

为什么我在和 str3 的末尾得到随机字符? 我知道有一个函数可以做到这一点,但我想用一种基本的方式来做。

【问题讨论】:

  • 有什么理由不使用strcat
  • 您应该在此处为'\0' 提供额外的charchar str3[strlen(str1)+strlen(str2)];
  • 是的,我不想使用函数。
  • 您没有在字符串末尾添加 NULL 字节。只需添加行str3[strlen(str1) + strlen(str2)] = 0;,顺便说一句,这里有很多不好的实践代码......
  • 旁白:"%20s" 应该是 "%19s"

标签: c arrays string concatenation


【解决方案1】:

因为您通过让printf() 读取str3 的边界来调用未定义的行为

你必须

  1. 再分配一个元素来终止空字符。
    char str3[strlen(str1)+strlen(str2)]; 应该是char str3[strlen(str1)+strlen(str2)+1];
  2. 在结果字符串的末尾放置一个终止空字符。
    即在printf() 语句之前添加str3[strlen(str1)+strlen(str2)] = '\0';

【讨论】:

  • 非常感谢:)
猜你喜欢
  • 2020-12-11
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 2012-05-30
  • 2017-12-24
  • 2016-06-02
相关资源
最近更新 更多