练习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;
}