首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >K&R练习4-3

K&R练习4-3
EN

Stack Overflow用户
提问于 2014-01-10 16:33:55
回答 1查看 580关注 0票数 1

我刚刚解决了练习4-10 -我用getline替换了(unget/get)char,但是我不能添加对负数的支持。理由很简单,如果一个字符是'-‘,而它旁边的字符是一个数字或小数点,那么我们就有一个负数。我不知道我做错了什么,我第一次尝试这样的事情:

代码语言:javascript
运行
复制
if(c != '-' && isdigit(line[lp])) {
    return c;
}

如果我们有一个负数,则不应该执行第2行,数组s将作为第一个元素a '-‘。然而,我得到一个无限循环,我找不到问题。

这是解决这个问题最相关的代码(尤其是getop中的第4条if语句)。

代码语言:javascript
运行
复制
#define MAXLINE 100
char line[MAXLINE];
int lp = 0;
int lineLength  = 0;
int getline(char s[], int lim) {
    int i, c;
    i = 0;
    while(--lim > 0 && (c = getchar()) != EOF && c != '\n')
        s[i++] = c;
    if(c == '\n')
        s[i++] = c;
    s[i] = '\0';
    return i;
}
int getop(char s[]) {
    if(lp  == lineLength) {
        lineLength = getline(line, MAXLINE);
        lp = 0;
    }
    if(lineLength == 0)
        return EOF;
    char c;
    int i;
    printf("the execution is here\n");
    while((s[0] = c = line[lp++]) == ' ' || c == '\t')
        /* skip tabs an white spaces */;
    s[1] = '\0';
    if(!isdigit(c) && c != '.' && c != '-')
        return c;
    if(c == '-') {
        if(isdigit(line[lp]) || line[lp] == '.')
            /* nothing */;
       else
            return c;
    }
    i = 0;
    if(isdigit(c))
        while(isdigit((s[++i] = c = line[lp++])))
            ;
    if(c == '.')
        while(isdigit((s[++i] = c = line[lp++])))
            ;
    lp--;
    return NUMBER;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-10 20:35:08

当您找到“-”时,您需要提前lp。函数底部的if不查找“-”。在函数返回之前,您会注意到其他数字(以及小数点)推进了lp,因此您需要将“-”符号复制到s[] (或将其存储在全局标志中)和增量lp,否则它只会一次又一次地处理相同的字符。

如果您查看lp对正数和负数所做的操作,那么在调试器中执行代码也可以帮助您了解问题所在。

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

https://stackoverflow.com/questions/21049576

复制
相关文章

相似问题

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