我刚刚解决了练习4-10-我用getline替换了(unget/get)char,但是我不能添加对负数的支持。道理很简单,如果一个字符是一个“-”,旁边的字符是一个数字或小数点,我们就有一个负数。我不知道我做错了什么,第一次尝试这样的事情:
if(c != '-' && isdigit(line[lp])) {
return c;
}
如果我们有一个负数,就不应该执行第2行,数组s将有一个“-”作为第一个元素。但是,我得到一个无限循环,我找不到问题所在。
这是这个问题最相关的代码(尤其是getop中的第4个if语句)。
#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;
}
最佳答案
当你找到一个“-”时,你需要提前lp
。函数底部的if不查找“-”。在函数返回之前,您会注意到其他数字(和小数点)前进了lp
,因此需要将该“-”符号复制到s[]
(或将其存储在global flag中)并递增lp
,否则它只是一遍又一遍地处理同一个字符。
如果您看看lp
对正数和负数的作用,那么在调试器中单步执行代码也可以帮助您看到问题所在。
关于c - K&R练习4-3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21049576/