【问题标题】:use strcat with strcpy occur problems使用 strcat 和 strcpy 出现问题
【发布时间】:2013-08-23 12:13:00
【问题描述】:

我在使用 strcat 函数时遇到问题。我不知道。请帮助我。谢谢

char dst[5]="hello";
char *a = "12345";
char *b = "54321";

//work
strcat(strcpy(dst, a), b);
printf("one==%s\n",dst);

//error
strcpy(dst, a);
strcat(dst, b);
printf("two==%s\n",dst);

【问题讨论】:

  • 你很幸运,第一个案例正在运行。
  • @Dayalrai 这种“运气”会导致卫星坠毁,当条件发生变化时人们会死亡。
  • “运气”是什么意思?

标签: c strcpy strcat


【解决方案1】:

这两个版本的问题是你写的都超过了dst 的结尾。 ab 都需要六个字节,包括 NUL 终止符; dst 只能容纳五个人。

这导致undefined behaviour

未定义行为的本质是它可能会或可能不会表现出来。如果是这样,它可能是以相当任意的方式。

【讨论】:

    【解决方案2】:

    您没有在 dst 指针上正确分配内存,这是一个工作代码:

    int             main()
    {
      char *dst;
      char *a = strdup("12345");
      char *b = strdup("54321");
    
      dst = malloc(100);
      dst = strdup("hello");                                                                             
    strcat(strcpy(dst, a), b);
    printf("one==%s\n",dst);                                                                                
    strcpy(dst, a);
    strcat(dst, b);
    printf("two==%s\n",dst);
    }
    

    【讨论】:

    • 在处理char时,不必有(sizeof (*dst)); C 标准明确定义 char 的大小为 1。
    【解决方案3】:

    程序:

    #include<string.h>
    #include<stdio.h>
    
    int main()
     {
            char dst[15]="hello";
            char *a = "12345";
            char *b = "54321";
    
            //work
            strcat(strcpy(dst, a), b);
            printf("one==%s\n",dst);
    
            //error
            strcpy(dst, a);
            strcat(dst, b);
            printf("two==%s\n",dst);
            return 0;
        }
    

    输出:

    # 1:   hide   clone   input   8 seconds ago
    result: success      time: 0s    memory: 2684 kB     returned value: 0
    
    input: no
    output:
    one==1234554321
    two==1234554321
    

    编辑: 您也可以使用 11 而不是 15..希望您了解代码的目的..

    【讨论】:

    • 您确实可以使dst 小于15,但它至少应该是11 字符长才能考虑到最后的0
    • 我的意思是当dst的大小为5时,strcat(strcpy(dst, a), b) 工作,为什么?
    猜你喜欢
    • 2011-11-07
    • 2016-01-21
    • 1970-01-01
    • 2015-08-16
    • 2013-12-26
    • 2016-03-14
    • 2017-01-18
    • 2017-03-15
    • 2014-06-17
    相关资源
    最近更新 更多