C编程:如何一次读取输入字节并仅输出整数作为标记?

时间:2012-06-04 23:55:39

标签: c

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

例如:如果输入为:

Hello 45 World Thank 67 you

应输出:

illegal
45
illegal
illegal
67
illegal

2 个答案:

答案 0 :(得分: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。您的计划并不关心,也不会帮助您关心。

答案 1 :(得分: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;
}