2

我是 C 编程的新手,我必须编写一个程序,它只从标准输入中提取整数并将它们作为标记输出。其他任何内容都应输出为“非法”。我不允许使用任何数组或 malloc,我只能声明整数或长整数。我必须使用 getchar() 输入和 printf() 输出,仅此而已。我的问题是,我如何一次读取输入字节,将它们转换为令牌并检查它们是否是整数?

例如:如果输入是:

Hello 45 World Thank 67 you

它应该输出:

illegal
45
illegal
illegal
67
illegal
4

2 回答 2

2

因为这是家庭作业(感谢您清楚地标记它),我将用伪代码给出一个草图,希望能让您走上正确的轨道。

因此,您的程序实际上并不关心标记化;它只需要为给定的输入打印正确的输出。

所以,像这样:

int ch; /* note _int_, not _char_ -- this will save you time debugging */

while ((ch = getchar()) != EOF)  /* idiomatic read-a-char loop */
    if ch == '0' or ch == '1' or ..
        print ch
        already_seen_invalid = 0
    else
        if already_seen_invalid == 0
            already_seen_invalid = 1
            print invalid

无论有多少字节无效,already_seen_invalid切换只会给你一个输出。invalid

不要担心尝试将字节转换'4''5'整数45。你的程序不关心,它也不会帮助你关心。

于 2012-06-05T00:08:59.860 回答
1
#include <stdio.h>
#include <ctype.h>
#include <limits.h>

int main() {
    int ch;
    int n;
    int takeNum, sign;
    long long int wk;//long long int as int64

    wk=0LL;
    takeNum = 0;//flag
    sign = 1;//minus:-1, other:1
    while(EOF!=(ch=getchar())){
        if(ch == '-'){
            sign = -1;
            continue;
        }
        if(ch >= '0' && ch <= '9'){
            if(takeNum >= 0)
                takeNum = 1;
            else
                continue;
            wk = wk * 10 + (ch - '0')*sign;
            if(INT_MAX < wk || INT_MIN > wk){//overflow
                takeNum = -1;//for skip
            }
            continue;
        }
        //space character continuing is "illegal"
        if(ch == ' ' || ch == '\t' || ch == '\n'){
            if(takeNum <= 0)
                printf("illegal\n");
            else
                printf("%d\n", n=wk);
            wk=0LL; takeNum=0; sign=1;//reset
        }
    }
    return 0;
}
于 2012-06-05T00:58:54.347 回答