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