如何识别输入是否结束?

时间:2012-12-10 18:39:03

标签: c scanf

我试图在循环中接受输入。我如何知道输入何时停止?比方说,我有一个int input,只要用户需要,我就会接受输入。但是我没有在每次进入之前提示。我不是在询问用户是否有更多输入,也不是我事先知道输入的数量。

如何停止接收输入?

这是我到现在为止。

while(1){
    scanf("%d",&input);
    if(conditionFulfilled)
        index=0;

    if(index)
        printf("%d",input);
}

在这里,只要条件不满足,我就打印一切。但是一旦条件满足,我会继续接受输入,但不要打印它们。我怎么知道输入何时停止?

我现在会试着让自己更清楚。

我想要做的是,我希望用户继续输入数字,现在我想以相同的顺序打印这些数字,但是一旦用户输入的数字大于50,我就不想打印它之后的任何数字。

此外,我不希望用户在达到上述条件后停止输入输入。此外,我每次都可以询问用户是否要输入更多号码?我只是希望他继续进入,然后一旦他完成了。我应该得到所需的打印输出。

但我无法弄清楚,我怎么知道用户是否完成了所有输入。

我原以为我可以将输入存储为字符,因为newLine存储在字符中但不存储在整数输入中。即scanf("%c",&input)。将存储\n字符,但如果它是scanf("%d",&input)将忽略所有newLines,现在我可以检查两个连续的换行符,这将阻止它。

嗯,我不确定这是不是正确的方法?

另外,如果我输入4然后按Enter键,现在4和enter都在输入流上,现在我如何清除newLine字符的输入流,并且只需要在我的变量4? 我希望现在更有意义吗?

编辑:我猜上面的解决方案无法正常工作,因为如果我将输入作为char我将无法处理22,因为它只需要前2个并离开另一个一个只在缓冲区中。

3 个答案:

答案 0 :(得分:0)

最好在getchar()循环中使用while并使用CTRL+D作为输入的EOF终结符。(但请确保您有足够大的缓冲区来存储输入)。

如果输入小于大小,则可以realloc获取新大小。这样可以节省空间。

答案 1 :(得分:0)

如果您只是在输入类似于20 20 foo 30的情况下只接受前2个输入时感到满意,那么就这样做:

while( scanf( "%d", &input ) == 1 )

但是,在任何合理的程序中,您都希望更优雅地处理无效输入。

答案 2 :(得分:0)

如果您希望用户执行以下操作:

5<enter>
16<enter>
3<enter>
...

只要他们愿意, 就无法知道 何时完成。我假设你正在谈论这种情况,因为你正在循环一个输入。

在这种情况下,你必须通过一个终止序列设置用户的结束状态,例如“输入-1停止”或者通过设置输入前的输入数量,“输入10个值”。

但是,如果您想同时接受任意数量的值,例如:

5 16 3 ... <enter>

然后,您可以将值读入包含scanf()的字符串,并在您的令牌字符周围分开(在这种情况下为空格)。如果你想这样做,你不需要循环。


因此,我们在您的代码中说条件aFulfilled是0的输入,并且您希望在输入-1时中断:

while(1){
scanf("%d",&input);
if(input == 0)
  index=0;
else if(input == -1)
   break;  
if(index)
printf("%d",input);
}

现在代码将继续输入和打印数字,直到他们输入0,此时它会继续记录数字,但在输入为-1之前不会使用它们。


根据您的修改

编辑

Well, I am not sure if it is the right way?
实际上没有“正确的方法”,这是你的计划,所以这取决于你。我的回答的第一部分解释了这一点,您必须定义您想要如何接受输入。你想让他们一次输入一个号码吗?你想要他们全部在一条线上吗?这取决于你!

Edit: I guess the above solution wont work, since if I am taking in the input as char I wont be able to process 22 since It will just take the first 2 and leave the other one in buffer only.
不,您的代码将它们作为整数%d。如果您将它们作为字符%c,那么是的,您是正确的多位数字,您必须做特别的工作:

如果用户输入22<enter>,您必须循环播放字符直到换行符,并且您必须按顺序移动数字:

2 * 10^1 + 2 * 10 ^0 = 22

Also, say if I enter 4 and then hit enter, now 4 and enter both are on the input stream, now how can I clear this input stream for the newLine character, and just take in 4 in my variable?

如果您通过scanf("%d", &input)读取数字,那么您不必担心换行符号。

希望有所帮助。