代码改变世界

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。