C、无法读取输入

C, can not read input

#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);
        }
    }

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

当我为 scanf 输入 1 时的输出是:

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

它不允许我为 getchar() 提供意见。

但是,当我为 menu 删除 scanf 并使用 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 scanf 我不知道的问题吗?在 java 中,在进行第二次输入之前,我们需要输入一些空白。是这样吗?

问题是您在为 scanf 输入数字后按 Enter。该数字由 scanf 使用,而由回车键生成的换行符驻留在标准输入流中(stdin)。

当程序执行到while循环时:

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

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


您可以添加

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

scanf 和您的 getchar() 之间的任意位置以清除 stdin

另一种方法是按照 @user3121023 的建议使用 scanf("%d%*c",&menu);%*c 指示 scanf 读取并丢弃一个字符。如果用户输入了一个数字然后为 scanf.

按回车键,它将丢弃换行符

其他内容:

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