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

C编程:如何一次读取输入字节并只输出整数作为标记?,c,C,我是C编程新手,我必须编写一个程序,只从标准输入中提取整数并将其作为标记输出。其他任何内容都应输出为“非法”。不允许我使用任何数组或malloc,我只能声明int或long int。I必须使用getchar()进行输入,使用printf()进行输出而不使用其他任何东西。我的问题是,如何一次读取输入字节,将它们转换为令牌并检查它们是否为int 例如:如果输入为: Hello 45 World Thank 67 you 它应该输出: illegal 45 illegal illegal 67 il

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

例如:如果输入为:

Hello 45 World Thank 67 you
它应该输出:

illegal
45
illegal
illegal
67
illegal

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

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

比如说:

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
无论有多少字节无效,
ready\u seen\u invalid
切换将只为您提供一个
invalid
输出

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

\include
#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;
}
#包括 #包括 int main(){ int-ch; int n; int takeNum,符号; long long int wk;//long long int as int64 wk=0LL; takeNum=0;//标志 符号=1;//减:-1,其他:1 而(EOF!=(ch=getchar()){ 如果(ch='-'){ 符号=-1; 继续; } 如果(ch>='0'&&ch=0) takeNum=1; 其他的 继续; wk=wk*10+(ch-'0')*符号; 如果(INT_MAXwk){//溢出 takeNum=-1;//用于跳过 } 继续; } //空格字符继续是“非法的” 如果(ch=''| | ch='\t'| | ch='\n'){
如果(takeNum不想问,但是老师没有提供任何关于如何在C中执行I/O的说明吗?或者他们只是把作业扔给你,看看你在互联网上是否方便?如果输入的整数太长,在语言描述中不能成为有效的整数,该怎么办?比如,
123456789001234567890
…我不得不问,到目前为止,你尝试过什么和/或你想过做什么?@sarnold-实际上它应该打印溢出,但我暂时没有打印这部分,只是因为我想从某个地方开始。如果输入是:Hello 4+5 worldAh,我现在知道,如果数字不正确,你有兴趣执行
溢出
路线太大了……希望这仍然是您了解最后一点的足够起点。:)检查仍然不够。@SharkTiles-这个程序有很多缺陷,因为我只是作为原型制作的。你的回答为我指明了正确的方向。答案的关键是设计一个状态机,它一次接受输入1个字符,看看它是否导致接受状态。