目标
编写函数 getInt 方法接收键盘输入,将字符流转为整数。
要求:
- 需要返回转换后的整数。
- 到达结尾时返回文件结束标记。
设计:
- 形参为指向 int 类型的指针 p,存储整数。
- 当到达结尾时返回 -1,否则返回正值。
int getInt(int *pn) {
跳过与数字表达式无关的字符;
if (字符 = '-') 符号为负;
获取 '-' 或 '+' 的下一个字符 c;
if (c 不是数字) 跳到第一行执行;
while (若 c 是数字) {
*pn = 10 * *pn + (c - '0');
获取下一个字符 c;
}
if (符号为负) *pn = -(*pn);
return c;
}
#include <stdio.h>
int getch(void);
void ungetch(int);
int getInt(int*);
int isSpace(int);
int isDigit(int);
int getInt(int *pn) {
int c;
skip:while (!isDigit(c = getch()) && c != EOF && c != '-' && c != '+');
int sign = (c == '-') ? -1 : 1;
if (c == '-' || c == '+') c = getch();
if (!isDigit(c) && c != EOF) {
ungetch(c);
goto skip;
}
for (*pn = 0; isDigit(c); c = getch()) {
*pn = *pn * 10 + (c - '0');
}
*pn *= sign;
if (c != EOF) ungetch(c);
return c;
}
int isSpace(int c) {
if (c == ' ' || c == '\t') {
return 1;
}
return 0;
}
int isDigit(int c) {
if (c >= '0' && c <= '9') {
return 1;
}
return 0;
}
#define BUFSIZE 100
static int buf[BUFSIZE];
static int size = 0;
int getch(void) {
return size > 0 ? buf[--size] : getchar();
}
void ungetch(int c) {
if (size < BUFSIZE) {
buf[size++] = c;
} else {
printf("ungetch: too many characters %c\n", c);
}
}
int main() {
int n = 10;
int arr[n];
for (int i = 0; i < n && getInt(&arr[i]) != EOF; i++) {}
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
书中代码:
#include <ctype.h>
#include <stdio.h>
int getch(void);
void ungetch(int);
int getInt(int*);
int main() {
int n = 10;
int arr[n];
for (int i = 0; i < n && getInt(&arr[i]) != EOF; i++) {}
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
int getInt(int *pn) {
int c, sign;
while (isspace(c == getch()));
if (!isdigit(c) && c != EOF && c != '+' && c != '-') {
ungetch(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;
}