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;
。您也不需要两个变量 lastSize
和 firstSize
。您还应该检查 realloc
的 return 值。
#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;
。您也不需要两个变量 lastSize
和 firstSize
。您还应该检查 realloc
的 return 值。