c-误解了getint函数的工作机制



在K&R、 在第五章的开头,介绍了的功能

通过将字符流分解为整数值来执行免费格式输入转换,每个调用一个整数。

函数非常简单,但我实际上不明白为什么c在第一个if-statement中被推回缓冲区。因此,每次调用getint时,它都会执行相同的操作。因为它将读取buffer中的下一个字符,即c。这一策略是否意在成为一种安全机制?

int getint(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;
if(c != EOF)
ungetch(c);
return c;
}

如果流中的下一个字符不是数字(或空格)的一部分,则您询问的代码会导致getint停止,因为它不是数字或符号字符。

其概念是,只要在输入中有可接受的数字时调用getint,它就会将这些数字转换为int值并返回。当您在输入中没有下一个可接受的数字时调用getint时,它将不会执行转换。由于它没有执行某个字符,因此会将未使用的字符留在流中。

适当的例程将返回错误指示,因此调用者可以容易地确定getint由于这个原因没有执行转换。实际上,调用者无法区分getint对输入中的"0"返回0和getint对输入中非数字返回0。但是,由于这只是教程代码,因此省略了类似的功能。

相关内容

  • 没有找到相关文章

最新更新