#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中,在进行第二次输入之前,我们需要放一些空白。是这样的吗?
答案 0 :(得分:1)
问题是您输入scanf
的号码后按 Enter 。当输入键按下生成的换行符位于标准输入流(scanf
)中时,stdin
消耗该数字。
当程序执行到达while
循环时:
while (( c = getchar() ) != '\n' && c != EOF)
getchar()
查看换行符,抓取它,将其分配给c
然后,循环不会执行,因为条件(c != '\n'
)为false。这是你没想到的。
您可以添加
while (( c = getchar() ) != '\n' && c != EOF);
在scanf
和getchar()
之间的任何地方,以清除stdin
。
另一种方法是按@user3121023 in the comments的建议使用scanf("%d%*c",&menu);
。 %*c
指示scanf
阅读并弃置角色。如果用户输入了数字,然后按下scanf
的输入,它将丢弃换行符。
其他东西:
c = EOF;
不是必需的。这里的演员也不是:text[i++]=(char)c;
。您也不需要两个变量lastSize
和firstSize
。您还应该检查realloc
的返回值。