You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言strncat引发Buffer overflow?字符串删除功能求助

问题分析与修复方案

你的代码存在几个关键问题,直接导致了缓冲区溢出:

  1. 字符串数组长度不足
    char howAreYou[9] = "howAreYou"; 中,"howAreYou"包含9个可见字符,但C语言字符串必须以'\0'(空字符)结尾才能被标准库函数正确识别。这个数组长度仅为9,没有预留空字符的位置,会导致strlen等函数读取内存时越界,行为不可预测。

  2. 目标字符串未初始化
    char newString[9]; 声明后未初始化,内存中是随机值。strncat需要目标字符串以'\0'结尾来确定追加的起始位置,未初始化的newString没有这个标记,strncat会错误地写入到数组外的内存,触发缓冲区溢出。

  3. 循环范围错误
    循环条件i < 8没有依据,原字符串如果修正长度后,应该遍历到所有有效字符(直到空字符前),而不是固定的8次。

  4. strncat使用不当
    虽然strncat本身是安全函数,但前提是目标字符串有足够空间且正确初始化,你的场景下用循环逐个字符复制其实更直接,避免strncat的使用风险。


修正后的代码:

#include <string.h>
#include <stdio.h>

int findIndex(char string[], char targetChar) {
    for (int index = 0; string[index] != '\0'; index++) {
        if (string[index] == targetChar) {
            return index;
        }
    }
    return -1;
}

int main(void) {
    // 预留空字符位置,数组长度设为10
    char howAreYou[10] = "howAreYou";
    // 初始化newString为空字符串,确保以'\0'结尾
    char newString[10] = "";
    
    int index = findIndex(howAreYou, 'o');
    
    int newIdx = 0;
    for (int i = 0; howAreYou[i] != '\0'; i++) {
        if (i != index) {
            // 直接逐个字符复制,避免strncat的问题
            newString[newIdx] = howAreYou[i];
            newIdx++;
        }
    }
    // 手动添加字符串终止符
    newString[newIdx] = '\0';

    printf("new string: %s", newString);
    return 0;
}

修正说明:

  • 给原字符串数组增加长度,预留'\0'的位置,确保标准库函数能正确处理。
  • 初始化newString为空字符串,保证它有合法的终止符。
  • 替换strncat为直接字符复制,逻辑更直观,也避免了strncat对目标字符串的要求。
  • 循环改为遍历到原字符串的终止符,适配任意长度的输入字符串。
  • 手动给新字符串添加终止符,确保它是合法的C语言字符串。

内容的提问来源于stack exchange,提问作者user19897564

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:25:34