gpt4 book ai didi

c - 由于 strncpy 检测到堆栈崩溃

转载 作者:行者123 更新时间:2023-11-30 17:44:47 24 4
gpt4 key购买 nike

我的 C 程序有问题。我创建了一个函数,它标记文本文件中的变量并将它们保存在一个集合中。问题是 string.h 中的 strncpy 函数在我的程序中表现得很奇怪。我将代码分解为最小的示例:

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

void tokenizeWord(int *i, char *text);

int main() {
char *text = "hallo 123 test foo bar etc";
int i;
for (i = 0; i < 24; i++) {
switch(text[i]){
case ' ':
i++;
default:
tokenizeWord(&i, text);

}
}
return 0;
}

void tokenizeWord(int *i, char *text) {
bool eow = false;
int start = *i;
int end = start;
if (i != NULL) {
while (*i < strlen(text) && !eow) {
switch(text[*i]) {
case ' ':
end = (*i);
eow = true;
break;
default:
(*i)++;
break;
}
}
char out[8] = "";
strncpy(out, text+start, end);
out[end-start] = '\0';
printf("%s\n", out);
}
}

打印出来的第一个变量是“hallo”,这是完全正确的行为。第二个变量已包含“123 test”。但因为我在 123 之后设置了\0 ,所以其余部分不会被打印。打印后,我立即收到*检测到堆栈粉碎*中止。我认为问题是,strncpy 函数尝试写入超过 8 个字符,但我告诉函数从位置 6 到 9 处的文本进行打印。那么为什么 strncpy 尝试复制超过 3 个字符呢?

我在 C 编程方面没有太多经验,尝试了很多方法,例如调试和打印输出来查找问题,但我还没有任何线索。我希望有人能帮助我。

最佳答案

更改以下内容

strncpy(out, text+start, end);

strncpy(out, text+start, end-start); 

如果 start = 6 且 end = 9,那么您将复制 9 个字节而不是 3 个字节。

了解更多关于Stack Smashing的信息.

关于c - 由于 strncpy 检测到堆栈崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19862279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com