嗨,这是我在这里的第一个问题,如果我没有遵守所有的发帖规则,我很抱歉。这是K&R练习2-3,我在使用GCC编译时遇到了分段错误,我不熟悉调试器来了解发生了什么。如果有人能浏览一下代码并帮助我解决问题,我将不胜感激。
#include <stdio.h>
#define HEX 16
unsigned int htoi(char s[]) {
int i, len, n, rp, v;
v = 0;
if (s[0] == '0')
if (s[1] == 'x' || s[1] == 'X')
s[1] = '0';
for (len = 0; len != '\0'; ++len) {
}
for (i = len; i >= 0; --i) {
if (s[i] >= '0' && s[i] <= '9')
n = s[i] - '0';
else if (s[i] >= 'A' && s[i] <= 'F')
n = s[i] - 'A' + 10;
else if (s[i] >= 'a' && s[i] <= 'f')
n = s[i] - 'a' + 10;
rp = len - i;
v += n * HEX^rp;
}
return v;
}
int main() {
int test = htoi("0x1a9f");
printf("%d\n", test);
return 0;
}
最佳答案
int test = htoi("0x1a9f");
将字符串文本
"0x1a9f"
传递到htoi
。这可能存在于只读内存中,无法修改。因此,当您试图写入行中的字符串时,会出现未定义的行为(崩溃就是一个有效的例子)s[1] = '0';
最简单的修复方法是将原始字符串复制到可修改的变量中
char s[] = "0x1a9f";
int test = htoi(s);
正如Grijesh所报告的,进一步深入到
htoi
,您还可以读取超出字符串范围的内容for (i = len; i >= 0; --i)
应该是:
for (i = len - 1; i >= 0; --i)
关于c - K&R 2-3 HTOI分割故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18010446/