2

I'm new to C programming and I have to write a program that picks up only the integers from the standard input and output them as tokens. Anything else should be outputted as "illegal". I'm not permitted to use any arrays or malloc, and I could only declare ints or long ints. I must use getchar() for input and printf() for output and nothing else. My question is, how do I read input byte at a time, convert them to tokens and check if they are ints?

For example: If the input is:

Hello 45 World Thank 67 you

It should output:

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_invalid1つの出力のみを提供します。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 に答える