嗨,这是我在这里的第一个问题,如果我没有遵守所有的发帖规则,我很抱歉。这是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/

10-11 22:10
查看更多