C,无法读取输入

时间:2015-07-04 10:54:42

标签: c input getchar

#include <stdio.h>
#include <stdlib.h>

int main()
{

   int i,j;//count
   int c;//for EOF test
   int menu;
   unsigned int firstSize = 12811;
   unsigned int lastSize;
   char * text=malloc(firstSize);

   if(text == NULL){
        printf("\n Error. no Allocation.");
        exit(-1);
   }
printf("\n for input 1e,for autoinput press 2.");
scanf("%d",&menu);


if(menu==1){
   printf("enter text..");

   c = EOF;
   i = 0;
   lastSize = firstSize;

    while (( c = getchar() ) != '\n' && c != EOF)
    {
        text[i++]=(char)c;

        //if i reached maximize size then realloc size
        if(i == lastSize)
        {
                        lastSize = i+firstSize;
            text = realloc(text, lastSize);
        }
    }

这是问题所在的代码部分。

1输入scanf时的输出是:

for input 1e,for autoinput press 2.
1
enter text..

我不允许我为getchar()提供输入。

但是当我删除scanf的{​​{1}}并使用menu时,我可以轻松地为menu=1;提供输入,并且它可以正确输出:

getchar()

而不是那个

printf("\n for input 1e,for autoinput press 2.");
scanf("%d",&menu);

关于我不了解的printf("\n for input 1e,for autoinput press 2."); //scanf("%d",&menu); menu=1; printf个问题吗?在java中,在进行第二次输入之前,我们需要放一些空白。是这样的吗?

1 个答案:

答案 0 :(得分:1)

问题是您输入scanf的号码后按 Enter 。当输入键按下生成的换行符位于标准输入流(scanf)中时,stdin消耗该数字。

当程序执行到达while循环时:

while (( c = getchar() ) != '\n' && c != EOF)

getchar()查看换行符,抓取它,将其分配给c然后,循环不会执行,因为条件(c != '\n')为false。这是你没想到的。

您可以添加

while (( c = getchar() ) != '\n' && c != EOF);

scanfgetchar()之间的任何地方,以清除stdin

另一种方法是按@user3121023 in the comments的建议使用scanf("%d%*c",&menu);%*c指示scanf阅读并弃置角色。如果用户输入了数字,然后按下scanf的输入,它将丢弃换行符。

其他东西:

c = EOF;不是必需的。这里的演员也不是:text[i++]=(char)c;。您也不需要两个变量lastSizefirstSize。您还应该检查realloc的返回值。