[英]How does the function getop() from “The C Programming Book” work?
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';
s将包含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()时也是如此?
让我们将其细分:
while((s[0] = c = getch()) == ' ' || c == '\\t')
从字符串的开头跳过所有空格和制表。 在此循环s[0]
末尾, s[0]
包含第一个字符,该字符不是前面提到的两个字符之一。 现在,如果c
不是.
或一个数字,我们只是将其返回。
if(!isdigit(c) && c != '.') {
return c;
}
如果c
不是数字,那么我们就完成了,将s[1]
设置为null
是完全正确的!
否则,如果c
是一个数字,我们将读取尽可能多的数字字符,因为我们可以从位置1
覆盖s
。 s [1]为'\\ 0',但这并不重要,因为s [++ i]在第一次迭代时为s [1]
i = 0;
if(isdigit(c))
while(isdigit(s[++i] = c = getch()))
因此s
保持一致状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.