c - 迭代复制多个字符

标签 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 == 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/

相关文章:

java - 将字符串扫描器转换为类类型

string - 如何在 Perl 中用正斜杠替换反斜杠?

C99 引用内联函数 : undefined reference to XXX and why should I put it to header?

c++ - 使用在 C 字符串中定位的两个 char* 获取子字符串

arrays - JOOQ 以 PostgreSQL 自定义类型作为数组 : ERROR: malformed record literal 失败

php - 使用 php 将多维数组从多个表转换为单个 json 数组值

json - Curl 和 jq 替换值中的子字符串

c - 在调用者的返回序列中跳过函数

c - 在 C 中动态分配结构数组

arrays - 在 Matlab 中求 min(x1, x1*x2, x1*x2*x3, ..., x1*x2*...*xN)