“如上所述,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。我该怎么做才能避免这种“问题”。
答案 0 :(得分:1)
要回答关于EOF
和-2
的第二个问题,我可以考虑几个解决方案:
ungetch()
多个角色。此方案的另一个优点是,您可能需要ungetch()
两次的第1部分中的代码也变得更容易。int buffered = 0;
,然后getch()
仅在buf
时返回buffered == 1
。 ungetch()
设置buffered = 1
,getch()
设置buffered = 0
:static int buf; static int buffered = 0; int getch() { if (buffered) { buffered = 0; return buf; } return getchar(); } void ungetch(int c) { buffered = 1; buf = c; }