首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K&R 2-3 htoi断层

K&R 2-3 htoi断层
EN

Stack Overflow用户
提问于 2013-08-02 06:48:23
回答 2查看 155关注 0票数 0

嗨,这是我在这里的第一个问题,如果我没有遵守所有的发帖规则,我很抱歉。这是K&R练习2-3,我在编译GCC时遇到了一个分段错误,我不熟悉调试器来理解正在发生的事情。如果有人能浏览一下代码,并帮助我了解出了什么问题,我将不胜感激。

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-02 06:51:29

代码语言:javascript
复制
int test = htoi("0x1a9f");

将字符串文本"0x1a9f"传递给htoi。这种情况可能存在于只读内存中,无法修改.因此,当您试图写入行中的字符串时,您会得到未定义的行为(崩溃是此行为的一个有效示例)。

代码语言:javascript
复制
s[1] = '0';

最简单的修复方法是将原始字符串复制到可修改的变量中。

代码语言:javascript
复制
char s[] = "0x1a9f";
int test = htoi(s);

正如Grijesh所报告的,深入到htoi中,您还可以读取超出字符串范围的内容。

代码语言:javascript
复制
for (i = len; i >= 0; --i) 

应:

代码语言:javascript
复制
for (i = len - 1; i >= 0; --i) 
票数 1
EN

Stack Overflow用户

发布于 2013-08-02 06:50:56

您正在传递字符串文字的地址,它是只读的.执行以下操作将消除分段错误。

代码语言:javascript
复制
char temp[] = "0x1a9f";
int test = htoi(temp);

另外:

代码语言:javascript
复制
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通知)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18010446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档