嗨,这是我的第一个问题,所以如果我没有遵守所有发布规则,我会道歉。这是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;
}
答案 0 :(得分:3)
您传递的字符串文字的地址是只读的。执行以下操作将消除分段错误。
char temp[] = "0x1a9f";
int test = htoi(temp);
此外:
v += n * HEX^rp;
^
是XOR运算符而不是幂运算符。要获得权力,您需要pow
math.h
功能
此外:
for (i = len; i >= 0; --i)
应为for (i = len - 1; i >= 0; --i)
,因为len
的值超出了数组的范围。 (由@Grijesh Chauhan和@simonc通知)
答案 1 :(得分:1)
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)