K& R 2-3 htoi分段故障

时间:2013-08-02 06:48:23

标签: c kernighan-and-ritchie

嗨,这是我的第一个问题,所以如果我没有遵守所有发布规则,我会道歉。这是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;
}

2 个答案:

答案 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)