gpt4 book ai didi

c - 迭代复制多个字符

转载 作者:行者123 更新时间:2023-11-30 14:55:34 26 4
gpt4 key购买 nike

这个函数似乎有问题:

void CatString(const char* srcStr, char** destStr, size_t* destCap) {

size_t destLen = strlen(*destStr);
unsigned int posDest = destLen;
int posSrc = 0;

while(srcStr[posSrc] != '\0') {
if( (destLen + 1) > *destCap )
DoubleString(destStr, destCap);

(*destStr)[posDest] = srcStr[posSrc];
posDest++;
posSrc++;
destLen++;
}
}

该函数应该将源字符串连接到目标字符串。如果目标字符串不够大,则使用 DoubleString() 将其大小加倍。 .

比方说srcStrCircles identical, overlap:destStr是空的。

调试时,我发现在迭代21 ( posSrc == 22 ) srcStrCircles identical, over 。在下一次迭代时出现问题:

(*destStr)[posDest] = srcStr[posSrc];是否出乎意料 -

srcStr更改自 Circles identical, overCircles identical, overlerlap: 。下一步按我的预期进行,字符串变为 Circles identical, overlarlap:依此类推,直到字符串变为 Circles identical, overlap: p: 。因此,如果没有意外的迭代 22,程序将正常运行。我之前的用法也没有显示任何错误迹象。

那么是什么让第 22 步的赋值复制了多个字符呢?

更多上下文代码 here .

编辑:空终止我的结果实际上似乎解决了问题,程序 assert现在正确并且 valgrind也很满意。

最佳答案

如果 *destStr 已进行 malloc:

int CatString(const char* srcStr, char** destStr) 
{
int result = 0;
char * tmp = malloc(sizeof(char) * (strlen(*destStr) + strlen(srcStr) + 1));

if (tmp == NULL) result = -1;
if (!result)
{
strcpy(tmp, destStr);
strcat(tmp, srcStr);
free(*destStr);
*destStr = tmp;
}
return result;
}
<小时/>

int CatString(const char* srcStr, char** destStr, size_t destCap) 
{
int result = 0;
size_t newStrlen = strlen(*destStr) + strlen(srcStr);

newStrlen = newStrlen > destCap ? destCap : newStrlen;

char * tmp = malloc(newStrlen + 1);

if (tmp == NULL) result = -1;
if (!result)
{
strcpy(tmp, *destStr);
strncat(tmp, srcStr, newStrlen - strlen(*destStr));
tmp[newStrlen] = '\0';
free(*destStr);
*destStr = tmp;
}
return result;
}

关于c - 迭代复制多个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45769752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com