0

嗨,这是我在这里的第一个问题,所以如果我没有遵守所有发帖规则,我深表歉意。这是 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;
}
4

2 回答 2

3

您正在传递只读字符串文字的地址。执行以下操作将摆脱分段错误。

char temp[] = "0x1a9f";
int test = htoi(temp);

还:

v += n * HEX^rp;

Is^是 XOR 运算符,而不是幂运算符。对于电源,您需要以下pow功能math.h

还:

for (i = len; i >= 0; --i)应该是for (i = len - 1; i >= 0; --i)因为 的值len超出了数组的范围。(由@Grijesh Chauhan 和@simonc 通知)

于 2013-08-02T06:50:56.730 回答
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) 
于 2013-08-02T06:51:29.830 回答