gpt4 book ai didi

c - C 中带有 malloc 的子字符串函数返回不正确的值

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:10 25 4
gpt4 key购买 nike

我正在用 C 语言为一阶逻辑公式实现解析器。要检查二进制连接公式(即形式为 (A BinaryConnective B)),我需要拆分字符串并检查 A 和 B 是否为公式。我使用 subString 函数完成了此操作,并从 partone 和 parttwo(分别为 A 和 B)调用它:

char *partone(char *g) {
//Given the formula (A*B) this returns A
return subString(g, 1, binPosition(g));
}

char *parttwo(char *g) {
//Given the formula (A*B) this returns B
return subString(g, binPosition(g) + 1, strlen(g) - 1);
}

子串函数如下:

char *subString(char *g, int start, int end) {
//the substring includes index start but does not include the end index.
char *substr = malloc(sizeof(char)*(end - start));
int i;
for(i = 0; i < (end - start); i++) {
substr[i] = g[start + i];
}
return substr;
}

当我传递除取反公式以外的任何函数时,这会起作用(我们使用字符“-”表示取反)。例如,当我通过 (-X[xz]>X[yz]) 时,程序会返回“不是公式”,但如果我在没有否定的情况下编写相同的代码,它就可以完美运行。问题是为 partone() 返回的 substr 是“-X[xz]$”,其中 $ 可以是我认为之前存储在内存中的任何随机字符。任何想法为什么只在这种情况下发生?我是 C 的新手,到处都看过。

提前致谢。

最佳答案

您忘记了 subString 函数中的终止 NUL。你的 malloc 应该看起来像

char* substring = (char*)malloc (sizeof (char)*(end-start+1));

最后你需要用 0 终止结果:

substring [end-start]=0;

因为 c 中的数组是零索引的,我很惊讶你没有丢失 A 部分的前导“-”,因为 partone 调用 subString1 作为 start

编辑:在 C/C++ 中有很多用于字符串操作的内置函数。您应该使用它们,因为它们已经过测试和优化。多年来我没有经常使用 C,所以我不是最新的 C++11 中合适的方法是什么,但谷歌可能会告诉你。

编辑:正如 chux 所指出的,您的 end 参数的含义并不完全清楚。所以需要检查parttwo中的strlen(g)-1或者subString中的循环条件,增加到+2 在我的 malloc 语句中。

关于c - C 中带有 malloc 的子字符串函数返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34097050/

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