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