这个函数似乎有问题:
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()
将其大小加倍。 .
比方说srcStr
是 Circles identical, overlap:
和destStr
是空的。
调试时,我发现在迭代21 ( posSrc == 22
) srcStr
是 Circles identical, over
。在下一次迭代时出现问题:
(*destStr)[posDest] = srcStr[posSrc];
是否出乎意料 -
srcStr
更改自 Circles identical, over
至Circles 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/