扫描标准输入中的所有整数。假设每个输入行都是整数,空行表示输入的结尾。
我需要从一行中扫描整数,如果输入的输入为空,则中断。 尝试了以下代码,但给出了奇怪的输出。
while (true)
{
char ch=getchar();
printf("%c\n",ch);
if(ch=='\n')
{
break;
}
//printf("%d\n",myInt);
getchar();
}
请帮助! 谢谢
答案 0 :(得分:1)
我发现您的代码存在许多问题:
该代码无法读取整数。它读取字符并打印。但是,由于不使用第二个getchar
的返回值,因此它仅打印第二个字符。
没有错误检查。
getchar
的返回类型为int
-不是char
。
有很多方法可以做您想要的。看来您想要使用getchar
的解决方案,因此可能是这样的方式:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
while (1)
{
int n = 0;
int multiplier = 1;
int ch=getchar();
if(ch=='\n') break; // Empty line - stop reading integers
if(ch=='-')
{
// Handle negative values
multiplier = -1;
ch=getchar();
if(ch=='\n') exit(1); // Error - unexpected newline
}
do
{
if(ch==EOF) exit(1); // Input error
if (ch < '0' || ch > '9') exit(1); // Error - input is not a digit
// "Add" current digit to the integer
n = n * 10;
n = n + ch - '0';
ch=getchar();
} while (ch != '\n');
n = multiplier * n;
printf("%d\n", n);
}
printf ("done\n");
return 0;
}
一些评论:
上面的代码不是“生产质量”,但我想保持示例简单。一些简短的描述如下。
仅在错误时调用exit(1)
可能不是您在实际应用程序中想要的。至少您首先要打印一些错误消息,但是通常,在处理用户输入时,您会添加更好的错误处理。
整数值的计算不检查整数溢出。在真实的应用程序中,您想添加一些东西。
实际上并不需要行if(ch==EOF) exit(1);
,因为下一个if语句将捕获这种情况并退出。但是,我添加了以显示输入错误和非数字输入之间的区别。
答案 1 :(得分:1)
根据您的假设,行是整数,因此我们可以使用以下代码。
atoi函数将string
转换为int
fgets用于从用户
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char str[1024]={};
while( fgets(str, 1024, stdin) && str[0] != 0 && str[0] != '\n' ){
int n = atoi(str);
printf("%d\n", n);
}
return 0;
}
答案 2 :(得分:-2)
最简单的方法是只读取整数,然后在没有更多的整数要读取时停止。 scanf
工作正常:
int n;
while (scanf("%d", &n) == 1) {
// do something with integer n
}
// last scanf call failed to find an integer, so that's probably the end of input
如果输入形式为“整数,空行,更多应忽略的整数”,则此方法将无效。在这种情况下,代码应该稍微复杂一些。
答案 3 :(得分:-3)
这是我认为您要寻找的。在原始代码段中,由于有两个getchar()函数,您将仅每隔两个整数打印一次,而不是删除将读取所有字符的整数。然后在打印语句之前包含if语句,意味着您在打印结果时不会打印换行符。
while (1)
{
char ch=getchar();
if(ch=='\n')
break;
printf("%c\n",ch);
}