【问题标题】:Can I copy a string in an empty string?我可以在空字符串中复制字符串吗?
【发布时间】:2013-07-11 17:04:18
【问题描述】:

假设我这样做是为了复制字符串。

char str[] = "";
char *str2 = "abc";
strcpy(str, str2);
printf("%s", str);  // "abc"
printf("%d", strlen(str));  // 3

然后,为什么它没有给我未定义的行为或导致程序失败。这样做有什么坏处?

【问题讨论】:

标签: c string


【解决方案1】:

您正在写入堆栈上分配给 str 的内存空间。你需要确保你有正确的 str 空间。在您提到的示例中,您需要为 a、b 和 c 加上一个空字符来结束字符串,所以这段代码应该可以工作:

char str[4];
char *str2 = "abc";
strcpy(str, str2);
printf("%s", str);  // "abc"
printf("%d", strlen(str));  // 3

【讨论】:

    【解决方案2】:

    此代码肯定会导致堆栈问题,尽管使用这么小的字符串,您看不到问题。举个例子:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
            char str[] = "";
            char *str2 = "A really, really, really, really, really, really loooooooooooooooonnnnnnnnnnnnnnnnng string.";
            strcpy(str, str2);
            printf("%s\n", str);
            printf("%d\n", strlen(str));
            return 0;
    }
    

    一个人为的例子,是的,但是运行它的结果是:

    A really, really, really, really, really, really loooooooooooooooonnnnnnnnnnnnnnnnng string.
    92
    Segmentation fault
    

    这是不鼓励使用 strcpy 函数的原因之一,建议使用需要指定所涉及字符串大小的复制和连接函数。

    【讨论】:

      【解决方案3】:

      它实际上给了你未定义的行为,但你的程序不必因此而失败。这就是未定义行为的工作原理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        • 2018-11-01
        • 1970-01-01
        相关资源
        最近更新 更多