C字符串连接 - 奇怪的字符

时间:2010-10-14 08:41:28

标签: c string concatenation

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

一切顺利,但有时,在目标字符串的开头,有一些奇怪的字符(例如,'?')。当在程序执行期间,最终字符串比之前更短(在同一执行期间)时,会发生这种情况。

我有什么遗失的吗?

这是代码:

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';

谢谢,

-Donovan

4 个答案:

答案 0 :(得分:7)

首先应该在分配目标字符串后将其初始化为空字符串。

target[0] = '\0';

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

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

答案 1 :(得分: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始终为空终止其目标。

答案 2 :(得分:1)

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

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

size++;

target = malloc(size);

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

char *current_ptr = target;

for(i = 0; i < n; i++) {
    size_t len = strlen(strings[i]);
    memcpy(current_ptr, strings[i], len);
    current_ptr += len;
}

*current_ptr = 0;

答案 3 :(得分:0)

此外,您无需将strncat的返回值收回目标。