【发布时间】:2010-01-03 15:32:33
【问题描述】:
“正如所写,getint 将 + 或 - 后不跟数字视为零的有效表示。修复它以将这样的字符推回输入。”
好的,这是原版:
int getint2(int *pn)
{
int c, sign;
while(isspace(c=getch()))
;
if(!isdigit(c) && c!= EOF && c!= '+' && c!= '-') {
ungetch(c);
return 0;
}
sign = (c == '-') ? -1 : 1;
if(c == '+' || c == '-') {
c = getch();
}
for(*pn = 0; isdigit(c); c = getch())
*pn = 10 * *pn + (c - '0');
*pn *= sign;
ungetch(c);
return c;
}
我是这样编辑的:
int getint2(int *pn)
{
int c, sign;
while(isspace(c=getch()))
;
if(!isdigit(c) && c!= EOF && c!= '+' && c!= '-') {
ungetch(c);
return 0;
}
sign = (c == '-') ? -1 : 1;
if(c == '+' || c == '-') {
c = getch();
if(!isdigit(c)) {
ungetch(c);
return 0;
}
}
for(*pn = 0; isdigit(c); c = getch())
*pn = 10 * *pn + (c - '0');
*pn *= sign;
ungetch(c);
return c;
}
所以我不确定作者想要什么。我应该也取消 +/-,还是只是在它之后的字符?如果 +/- 或 -1 之后没有数字,我应该返回 0 吗?
我还有一个关于 getch 和 ungetch 函数的问题: 因为我系统上的 EOF 是 -1,这就是我写 getch 和 ungetch 的方式:
int buf = EOF;
int getch()
{
int temp;
if(buf == -2)
return EOF;
if(buf == EOF)
temp = getchar();
else
{
temp = buf;
buf = EOF;
}
return temp;
}
void ungetch(int c)
{
if(c == EOF)
buf = -2;
buf = c;
}
所以有人告诉我 EOF 可以是-2。我应该怎么做才能避免这种“问题”。
【问题讨论】:
-
我们知道,这是作业问题吗?如果是这样,您的提问方式是正确的,通过发布您已经完成的工作并提出具体问题,但最好提及这是家庭作业,以便人们在回答时牢记这一点。
-
如果您只提供一个字符的“放回”缓冲区,您不妨直接使用
getchar和ungetc,而不是滚动您自己的getch/ungetch对。我认为您的更改将需要多个“un-get”字符,但您的实现可能会提供这一点。 -
不,这是 K&R 的一个练习,但我想从现在开始我会提到它。
-
是的,我使用 getch 和 ungetch,因为书中暗示了这一点。不,我不需要超过一个字符的 unget,因为函数总是在 unget 一个字符后返回。
-
这取决于你读到“推动这样一个角色”的内容。如果它表示“+”或“-”,那么您必须查看它后面的字符,确定它是非数字,然后将非数字和“+”或“-”推回读取缓冲。如果它仅表示非数字(可能是预期的),那么是的,只需要一个“un-get”字符。