当前位置: 代码迷 >> 综合 >> C程序设计语言 5-1
  详细解决方案

C程序设计语言 5-1

热度:40   发布时间:2024-01-20 04:15:50.0

 练习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 10int 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");elsebuffer[bufp++] = c;return;
}

下面是我的题目答案:

#include <stdio.h>
#include <ctype.h>#define SIZE 10
#define BUFSIZE 10int 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;}elsec = 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");elsebuffer[bufp++] = c;return;
}