C程序设计语言 5-1

 练习5-1 在上面的例子中,如果符号+或-的后面紧跟的不是数字,getint函数将把符号视为数字0的有效表达方式。修改该函数,将这种形式的+或-号重新写回到输入流中。

 

照着书上的程序抄的,结果一直有错。编译可以顺利进行,但是每次一输入字母程序就直接返回。后来发现书上的程序有点小错,在getint函数中第一个条件语句if下面不应该有ungetch函数出现。因为如果此时输入的是字母,ungetch函数会把字母输入到自己定义的缓冲区中,之后调用getch就只会得到刚刚放进去的字母,并一直返回。把这行删掉之后程序就可以正常运行了,可以输入:12a23-23 12aad

得到输出。

以下是修改后的原始程序,习题5-1的程序在后面。

#include <stdio.h>
#include <ctype.h>

#define SIZE 10
#define BUFSIZE 10

int getch();
void ungetch(int c);
int getint(int *pn);

char buffer[BUFSIZE];
int bufp;

int main()
{
	int n, array[SIZE];
	
	for (n = 0; n < SIZE; array[n++] = 0) //初始化数组,将所有值置为零
		;
	for (n = 0; n < SIZE && getint(&array[n]) != EOF; n++) //根据命令行的输入流将数组分别赋为相应数值
		;
	for (n = 0; n < SIZE; printf("%d ", array[n++])) //打印值
		;
	return 1;
}

//书中函数:接收一个字符串或字符,如果字符为字母则直接返回,不会把字母存入缓冲区;如果为‘+’,‘-’或数字则接收并将其值顺序赋给数组array
int getint(int *pn)
{
	int c, sign;

	while (isspace(c = getch()))
		;
	if (!isdigit(c) && c != EOF && c != '+' && 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;
}

//第四章函数:如果缓冲区有值则从缓冲区取值,若缓冲区为空则调用系统getchar函数从命令行读取输入流
int getch()
{
	return (bufp > 0) ? buffer[--bufp] : getchar();
}

//第四章函数:将得到的字符装入缓冲区,若缓冲区满则报错
void ungetch(int c)
{
	if (bufp >= BUFSIZE)
		printf("oversized...\n");
	else
		buffer[bufp++] = c;

	return;
}

下面是我的题目答案:

#include <stdio.h>
#include <ctype.h>

#define SIZE 10
#define BUFSIZE 10

int getch();
void ungetch(int c);
int getint(int *pn);

char buffer[BUFSIZE];
int bufp;

int main() {
	
	int n, array[SIZE];
	
	for (n = 0; n < SIZE; array[n++] = 0) //初始化数组,将所有值置为零
		;
	for (n = 0; n < SIZE && getint(&array[n]) != EOF; n++) //根据命令行的输入流将数组分别赋为相应数值
		;
	for (n = 0; n < SIZE; printf("%d ", array[n++])) //打印值
		;
		
	return 1;
}

/*书中函数:接收一个字符串或字符,如果字符为字母则直接返回,不会把字母存入缓冲区;如果为‘+’,‘-’或数字则接收并将其值顺序赋给数组array*/
int getint(int *pn) {
	
	int c, temp, sign;

	while (isspace(c = getch()))
		;
	if (!isdigit(c) && c != EOF && c != '+' && c != '-')
		return 0;
	sign = (c == '-') ? -1 : 1;
	if (c == '+' || c == '-') {
		if (!isdigit(temp = getch())) {
			ungetch(c);
			return 0;
		}
		else
			c = temp;
	}
	for (*pn = 0; isdigit(c); c = getch())
		*pn = 10 * *pn + (c - '0');
	*pn *= sign;
	if (c != EOF)
		ungetch(c);

	return c;
}

/*第四章函数:如果缓冲区有值则从缓冲区取值,若缓冲区为空则调用系统getchar函数从命令行读取输入流*/
int getch() {
	
	return (bufp > 0) ? buffer[--bufp] : getchar();
}

/*第四章函数:将得到的字符装入缓冲区,若缓冲区满则报错*/
void ungetch(int c) {
	
	if (bufp >= BUFSIZE)
		printf("oversized...\n");
	else
		buffer[bufp++] = c;

	return;
}

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值