Pointers and Arrays_1
2017-02-09 18:08 星星之火✨🔥 阅读(176) 评论(0) 收藏 举报1、在TCPL Reading Notes 53 中,如果符号+ 或- 的后面紧跟的不是数字,getint 函数将把符号视为数字0 的有效表达式。修改该函数,将这种形式的+ 或- 符号重新压回输入缓冲区。
#include <stdio.h>
#include <ctype.h>
int getch(void);
void ungetch(int);
// getint: get next integer from input into *pn
int getint(int *pn)
{
int c, d, sign;
while(isspace(c = getch())) // skip white space
;
if(!isdigit(c) && c != EOF && c != '+' && c != '-')
{
ungetch(c); // it is not a number
return 0;
}
sign = (c == '-') ? -1 : 1;
if(c == '+' || c == '-')
{
d = c; // remember sign char
if(!isdigit(c = getch()))
{
if(c != EOF)
ungetch(c); // push back non-digit
ungetch(d); // push back sign char
return d; // return sign char
}
}
for(*pn = 0; isdigit(c); c = getch())
*pn = 10 * *pn + (c - '0');
*pn *= sign;
if(c != EOF)
ungetch(c);
return c;
}
在遇到符号字符时,修改后的getint 函数会把它保存到变量d 中并读入下一个字符。如果下一个字符既不是一个数字也不是EOF 标记,getint 函数就会把新读入的这个字符压回输入缓冲区。然后,函数getint 会把保存到变量d 中的符号压回输入缓冲区,并返回这个符号以表明这种情况。
2、模仿getint 的实现方法,编写一个读取浮点数的getfloat 函数。getfloat 函数的返回值应该是什么类型?
#include <stdio.h>
#include <ctype.h>
int getch(void);
void ungetch(int);
// getfloat: get next floating-point number from input
int getfloat(float *pn)
{
int c, sign;
float power;
while(isspace(c = getch())) // skip white space
;
if(!isdigit(c) && c != EOF && c != '+' && c != '-' && c != '.')
{
ungetch(c); // it's not a number
return 0;
}
sign = (c == '-') ? -1 : 1;
if(c == '+' || c == '-')
c = getch();
for(*pn = 0.0; isdigit(c); c = getch())
*pn = 10.0 * *pn + (c - '0'); // integer part
if(c == '.')
c = getch();
for(power = 1.0; isdigit(c); c = getch())
{
*pn = 10.0 * *pn + (c - '0'); // fractional part
power *= 10.0;
}
*pn *= sign / power; // final number
if(c != EOF)
ungetch(c);
return c;
}
这里,getfloat 函数返回EOF 或者紧跟在浮点数后面的那个字符的ASCII值。因此,这个函数的类型应该是int。
浙公网安备 33010602011771号