嗨,这是我在这里的第一个问题,如果我没有遵守所有的发帖规则,我很抱歉。这是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;
}发布于 2013-08-02 06:51:29
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) 发布于 2013-08-02 06:50:56
您正在传递字符串文字的地址,它是只读的.执行以下操作将消除分段错误。
char temp[] = "0x1a9f";
int test = htoi(temp);另外:
v += n * HEX^rp;^是异或运算符,而不是幂运算符。对于power,需要在pow中使用math.h函数
另外:
for (i = len; i >= 0; --i)应该是for (i = len - 1; i >= 0; --i),因为len的值超出了数组的范围。(由@Grijesh Chauhan和@simonc通知)
https://stackoverflow.com/questions/18010446
复制相似问题