【问题标题】:C strings concatenation - strange charactersC字符串连接 - 奇怪的字符
【发布时间】:2010-10-14 08:41:28
【问题描述】:

我正在编写一个 C 程序,它接受 n 字符串并使用 strcat 将它们连接起来。 首先,我将目标字符串分配在sizeof(char)* 每个字符串的strlen + 1(对于空字符)。然后使用 for 我使用 strncat 创建最终字符串。 在 and 处,我添加了空字符。

一切正常,但有时,在目标字符串的开头,有一些奇怪的字符(例如,'?')。这发生在程序执行期间,最终字符串比以前短(在相同执行期间)。

我有什么遗漏吗?

这是代码:

size = 0;
for(i = 0; i < n; i++) {
    size += sizeof(char)*(strlen(strings[i]));
}

size++;

target = malloc(size);

if(!target) { /** Error handling... */ }

for(i = 0; i < n; i++) {
    target = strncat(target, strings[i], strlen(strings[i]));
}

target[size] = '\0';

谢谢,

——多诺万

【问题讨论】:

  • 如何将第一个字符串实际放入目标字符串中?
  • 对不起。现在也有代码了。
  • 另外你不需要将strncat的返回值收集回target。

标签: c string concatenation


【解决方案1】:

你应该在分配后立即将目标字符串初始化为一个空字符串。

target[0] = '\0';

在第一次调用strncat 时,第一个字符串将附加到目标。如果您的目标未初始化,则它可能不是空的,这会导致您看到乱码。

(另一种解决方案是将带有strncpy 的第一个字符串复制到目标中,然后将以下字符串附加到它。)

【讨论】:

    【解决方案2】:
    target[size] = '\0';
    

    大小为n 的数组具有0n - 1 的有效索引。您可能希望将其更改为:

    target[size-1] = '\0';
    

    (虽然这不会导致您开始使用垃圾字符。对此,请参阅Didier Trosset's answer。)

    更多代码提示:

    • sizeof (char) == 1 的定义,所以可以省略。
    • 既然您确定字符串适合,您可以在此处使用普通的strcat。这将为您节省 nstrlen 的调用。
    • 最终的target[size-1] = '\0' 实际上是不需要的,因为str(n)cat 总是以空值终止其目标。

    【讨论】:

      【解决方案3】:

      顺便说一句,每次调用strncat() 都必须遍历字符串才能找到插入的位置。这使得你的函数 O(n2)。做得更好是相当简单的(对代码的更改以粗体):

      大小 = 0; for(i = 0; i char *current_ptr = 目标; for(i = 0; i size_t len = strlen(strings[i]); memcpy(current_ptr, 字符串[i], len); current_ptr += len; } *current_ptr = 0;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-13
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多