int getop(char *s) {
int i, c;
while((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if(!isdigit(c) && c != '.') {
return c;
}
i = 0;
if(isdigit(c))
while(isdigit(s[++i] = c = getch()))
;
if(c == '.')
while(isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if(!isdigit(c))
ungetch(c);
return NUMBER;
}
我在制作一个名为“反向抛光计算器”的例子时遇到了这个问题。 我们可以通过这个函数输入计算器操作的数字,但是我没有得到这个函数的工作。等。,
如果我们输入一些像---->
这样的输入12.34 11.34 +
这
while((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
将包含1.但是剩下的输入从哪里进入s?
我已经完成了这个功能,我开始知道它正在工作,但后来我想知道深度工作,就像完整的流程一样。 任何帮助都是高度关注的。
编辑: - 在测试了各种输入后,我得出的结论是getch()和ungetch()的需要是什么,我的意思是,他们在那里找到了不需要的未读字符,而不是查看测试用例。
int getop(char *s) {
int i, c;
while((s[0] = c = getchar()) == ' ' || c == '\t')
;
s[1] = '\0';
if(!isdigit(c) && c != '.') {
return c;
}
i = 0;
if(isdigit(c))
while(isdigit(s[++i] = c = getchar()))
;
if(c == '.')
while(isdigit(s[++i] = c = getchar()))
;
s[i] = '\0';
/* if(!isdigit(c))
ungetch(c);*/
return NUMBER;
}
这里我用getchar()替换了getch(),它仍然接受了输入
12a 12 -
并且输出绝对正确,并且未读取'a'字符
144
我使用getch()时的情况如此?
答案 0 :(得分:0)
让我们一块一块地分解:
while((s[0] = c = getch()) == ' ' || c == '\t')
从字符串的开头跳过所有空格和制表。在此循环结束时,s[0]
包含第一个不是前面提到的两个字符的字符。现在,如果c
不是.
或数字,我们只需返回该数字。
if(!isdigit(c) && c != '.') {
return c;
}
如果c
不是数字,我们就完成了,将s[1]
设置为null
是完全正确的!
否则,如果c
是一个数字,我们会读取尽可能多的数字字符,因为我们可以从位置s
覆盖1
。 s [1]是'\ 0'但是没关系,因为s [++ i]在第一次迭代时会是[1]
i = 0;
if(isdigit(c))
while(isdigit(s[++i] = c = getch()))
因此s
保持一致状态。