迭代复制多个char

时间:2017-08-19 09:10:18

标签: c arrays string loops assign

此功能似乎存在问题:

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 == 22srcStrCircles identical, over。在下一次迭代中出现问题:

(*destStr)[posDest] = srcStr[posSrc];会出现意外情况 -

srcStrCircles identical, over更改为Circles identical, overlerlap:。下一步按预期工作,字符串变为Circles identical, overlarlap:,依此类推,直到字符串变为Circles identical, overlap: p:。因此,在没有意外迭代22的情况下,程序正常运行。我之前的用法也没有出现任何错误迹象。

那么是什么让步骤22中的作业复制了多个字符?

更多上下文here的代码。

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

1 个答案:

答案 0 :(得分:1)

如果* destStr是malloc-ed:

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