C语言strncat引发Buffer overflow?字符串删除功能求助
问题分析与修复方案
你的代码存在几个关键问题,直接导致了缓冲区溢出:
字符串数组长度不足
char howAreYou[9] = "howAreYou";中,"howAreYou"包含9个可见字符,但C语言字符串必须以'\0'(空字符)结尾才能被标准库函数正确识别。这个数组长度仅为9,没有预留空字符的位置,会导致strlen等函数读取内存时越界,行为不可预测。目标字符串未初始化
char newString[9];声明后未初始化,内存中是随机值。strncat需要目标字符串以'\0'结尾来确定追加的起始位置,未初始化的newString没有这个标记,strncat会错误地写入到数组外的内存,触发缓冲区溢出。循环范围错误
循环条件i < 8没有依据,原字符串如果修正长度后,应该遍历到所有有效字符(直到空字符前),而不是固定的8次。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
相关产品推荐
相关产品推荐

