我尝试编译此代码:
#include <stdio.h>
void print(FILE *a)
{
int main();
int count=20;
int c;
int stop=0;
char answer;
while(!stop){
while((c=getc(a))!=EOF){
fprintf(stdout,"%c",c);
if(c=='\n'){
count--;
if(!count){
printf("do you want continue:y=for continue/q=for quit");
fflush(stdin);
answer=getchar();
if(answer=='y' || answer=='Y')
count=20;
else if(answer=='Q' || answer=='q'){
printf("you quit this program,press any key and hit the enter to close");
stop=1;
break;
}
else{
printf("argument is unacceptable,rolling back action");
main();
}
}
}
}
if(c==EOF)
stop=1;
}
}
void halt()/*do nothing just for halt and waiting for input*/
{
int a;
scanf("%d",&a);
}
int main()
{
FILE *in,*fopen();
char name1[25];
int a;
printf("enter the name of the file you want to show:");
scanf("%24s",name1);
in=fopen(name1,"r");
if(in==NULL){
printf("the files doesnt exist or it is in another directory, try to enter again\n");
main();
}
else
print(in);
fclose(in);
halt();
return 0;
}
真正重要的是这部分:
if(!count){
printf("do you want continue:y=for continue/q=for quit");
fflush(stdin);
answer=getchar();
if(answer=='y' || answer=='Y')
count=20;
else if(answer=='Q' || answer=='q'){
printf("you quit this program,press any key and hit the enter to close");
stop=1;
break;
}
else{
printf("argument is unacceptable,rolling back action");
main();
}
}
该程序预计会显示一个文件的20行内容,但是当我在终端中运行时,当它到达if-else
部分时会发生一些事情,它会倾向于执行其他任何我放入的内容answer
variable.did我做错了什么
注意:我已尝试使用不同的编译器(如lcc-win32)编写此代码,并且工作正常。
答案 0 :(得分:3)
不确定问题是什么,这是基于您的代码的成对向下q&amp; d示例,并按预期工作。
#include <stdio.h>
int main(int argc, char * argv[])
{
char answer;
while(1) {
printf("\ndo you want continue:y=for continue/q=for quit: ");
fflush(stdin);
answer=getchar();
if(answer=='y' || answer=='Y')
puts("y/Y entered");
else if(answer=='Q' || answer=='q'){
puts("q/Q entered");
break;
}
else
puts("Something other than q/y entered.");
}
}
不幸的是,我现在时间紧迫,所以我无法检查你的版本和我的版本之间是否有任何实质性差异......我不记得了。
这是在Ubuntu下用gcc 4.4.3测试的。
看看这是否适合你。
答案 1 :(得分:2)
问题是fflush(stdin)
没有标准化,并且在不同的系统上表现不同。有关详细信息,请查看http://c-faq.com/stdio/stdinflush.html和http://c-faq.com/stdio/stdinflush2.html
所以这里发生了什么:您正在使用scanf("%24s",name1);
从stdin读取数据,例如用户输入文件名(例如test.c
并按返回。{{1现在包含stdin
。test.c\n
现在从stdin读取最多24个字符,在我们的情况下scanf
,并在test.c
中留下\n
,这意味着{{} 1}}现在包含stdin
。stdin
调用不会从\n
删除fflush(stdin)
,这意味着您的\n
调用将从标准输入读取stdin
这解释了所描述的行为。
getchar()
之前: t e s t 。 C \ n \n
之后: \ n - scanf使用scanf
并将其分配给scanf
test.c
之后: \ n name1
之后:空fflush(stdin)
读取并返回getchar()
有关此确切问题的详细信息,可能更好的说明请查看c-faq entry about fflush vs. gets