我正在编写一个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
答案 0 :(得分:7)
首先应该在分配目标字符串后将其初始化为空字符串。
target[0] = '\0';
在第一次调用strncat
时,第一个字符串将附加到目标。如果您的目标未初始化,则可能不为空,这会导致您看到的垃圾字符。
(另一种解决方案是将带有strncpy
的第一个字符串复制到目标中,然后将以下字符串附加到其中。)
答案 1 :(得分:2)
target[size] = '\0';
大小为n
的数组具有有效索引0
到n - 1
。您可能希望将其更改为:
target[size-1] = '\0';
(虽然这不会导致您启动垃圾字符。为此,请参阅Didier Trosset's answer。)
您的代码的其他一些提示:
sizeof (char) == 1
,省略省略。strcat
。这样可以节省n
次strlen
次来电。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的返回值收回目标。