在双向链表的结点中,每个结点包含一个字符数组用于存放字符内容。当在结点中插入新的字符串时,如果字符串长度超过了当前结点剩余的字符空间,需要对结点进行拆分,并创建一个新的结点来存放剩余的字符串。

然而,在输出结点时,如果直接使用 printf 函数输出字符数组,会导致乱码的问题。这是因为字符数组中的字符可能不是以终止符'\0'结尾,printf 函数会继续输出内存中的内容直到遇到终止符。

为了解决这个问题,可以在创建结点时,确保字符数组的末尾处有终止符'\0'。修改代码如下:

void insertString(novel* info, char* str) {
    novel* newNode;
    int len = strlen(str);  // 获取要插入的字符串的长度
    int remainingSpace = MaxSize - strlen(current->word);  // 计算当前节点中剩余的字符空间

    if (len <= remainingSpace) {
        strcat(current->word, str);  // 如果要插入的字符串长度小于等于剩余空间,则直接追加到当前节点的字符数组末尾
    } else {
        int splitPos = MaxSize / 2;  // 计算当前节点字符数组分割的位置
        strncpy(current->word + strlen(current->word), str, splitPos);  // 将要插入的字符串的前半部分复制到当前节点字符数组的末尾
        current->word[MaxSize] = '\\0';  // 确保字符数组末尾为终止符

        newNode = (novel*)malloc(sizeof(novel));  // 创建一个新节点
        newNode->Llink = current;  // 将新节点的前指针指向当前节点
        newNode->Rlink = current->Rlink;  // 将新节点的后指针指向当前节点的后继节点
        if (current->Rlink != NULL) {
            current->Rlink->Llink = newNode;  // 如果当前节点有后继节点,则将后继节点的前指针指向新节点
        }
        current->Rlink = newNode;  // 将当前节点的后指针指向新节点

        strncpy(newNode->word, str + splitPos, len - splitPos);  // 将要插入的字符串的后半部分复制到新节点的字符数组
        newNode->word[len - splitPos] = '\\0';  // 确保新节点字符数组末尾为终止符
    }

    current->pages++;  // 更新当前节点的页数
    current->paragraph++;  // 更新当前节点的段落数
    current->row++;  // 更新当前节点的行数

    // 检查是否满足字符数量要求
    if (len > MaxSize / 2 && len <= MaxSize && current->Rlink != NULL) {
        novel* nextNode = current->Rlink;
        if (strlen(nextNode->word) + len <= MaxSize) {
            strcat(nextNode->word, str);  // 如果满足要求,则将字符串追加到下一个节点的字符数组末尾
            nextNode->word[strlen(nextNode->word)] = '\\0';  // 确保下一个节点字符数组末尾为终止符
            current->pages++;  // 更新当前节点的页数
            current->paragraph++;  // 更新当前节点的段落数
            current->row++;  // 更新当前节点的行数
        }
    }
}

这样,在输出结点时就不会出现乱码问题了。


原文地址: http://www.cveoy.top/t/topic/bL0U 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录