【问题标题】:Adding space to char** element with strcat [duplicate]使用 strcat 向 char** 元素添加空间 [重复]
【发布时间】:2013-12-02 15:50:51
【问题描述】:

我得到了这样的数组:

char *family[3] ={"son", "father", "sister"};

我想通过使用函数strcat(son," "); 将每个元素的长度对齐到相同的大小,但我得到了核心转储。

【问题讨论】:

  • 改用asprintf

标签: c arrays char strcat


【解决方案1】:

您不能将strcat() 转换为文字。而后者就是这三个“字符串”是什么。

文字被放置在只读内存中。它们可能不会被覆盖,尝试这样做会导致运行时错误。

【讨论】:

    【解决方案2】:

    strcat() 将源字符串的副本附加到目标字符串的末尾,包括终止的 ASCII NUL 字节。要附加的字符串的初始字符会覆盖目标字符串末尾的 NUL 字节。

    因此,不能将“son”设置为目标字符串,因为它是文字字符串,

    `strcat(family[0], "");是您正在尝试做的事情,但这也不起作用,因为family[0] 已经设置为“son\0\0\0\0”,并且会导致缓冲区溢出。

    改为这样做:

    char *family[3] ={"son   ", "father", "sister"};//now family[0] is initialized with spaces to match length
                                                    //(and strcat() statment is not needed)
    

    【讨论】:

    • "now that family[0] has room" 是一个误导性的论点,因为在 char*[] 示例中也有 "room"不管怎样,你给。
    • 是的,但是在第一个正确的例子中,不需要执行strcat。目的是展示它为什么会起作用,以及为什么它不会起作用。我将发表评论澄清。谢谢。
    • char * family[3] = {"son\0\0\0\0",... 有“空间”,需要用空格和strcat() 填充将失败。问题不在于内存不足或足够(“空间”)。
    • 我正在写一条线来解决你们其余的评论,请耐心等待。
    • 我很抱歉,但同样的论点在这里:“但这也行不通,因为family[0]只有4个字节,需要7个。”虽然这是是的,这不是分段违规的原因。
    【解决方案3】:

    我认为你试图写这样的东西:

    char family[3][MAX_LEN] = {"son", "father", "sister"};
    strcat (family[i], "   ");
    

    “家”的定义与原文的区别:

     char *family[3] ={"son", "father", "sister"};
    

    在这里你有 3 个指针指向 3 个只读的文字 const 字符串。因此你不能用 strcat 修改它们。

    而在 char s[3][L]={"a","b","c"} 上,您在堆栈中分配了 3 个长度为 L 的 char 数组,并将它们初始化为 3 个文字。所以现在你可以用 strcat 修改它们,如果 L 足够大......

    另外,正如@alk 指出的那样,你以错误的方式使用 strcat()...

    【讨论】:

    • 你不能 strcat 到一个字符串常量!
    • 是的,抱歉,已编辑
    • 再一次,你不能 strcat 到一个字符串常量!
    • @manuell:答案变了,不再是一个常数了。
    猜你喜欢
    • 2019-03-10
    • 1970-01-01
    • 2014-09-14
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多