我尝试编译此代码:
#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;
}
该程序的目的是显示文件的20行内容。我使用lccwin32在windows xp中编译它,它按预期工作。但是当我将我的操作系统更改为linux(Ubuntu:pricise pangolin 12.04 LTS Desktop
)并使用gcc.first编译它时出现问题似乎工作正常,但直到第20行和提示符出来,当我放入参数(y
为继续,q
退出并点击输入,但不会发生。它只是滑到else
部分,这又重新启动了程序。那么它是gcc我有错误还是我的代码不适合gcc或者我可能错过了什么?
答案 0 :(得分:1)
我讨厌scanf。我建议用fgets(s,24,stdin)替换scanf(“%24s”,name1); (然后不幸地做了if(s [strlen(s)-1] =='\ n')s [strlen(s)-1] ='\ 0'来摆脱最后的\ n。
我还建议:
答案 1 :(得分:1)
除了@Foon报告的问题之外,您还遇到了这些问题:
您的问题是,当您调用getchar()时,输入缓冲区中仍然存在换行符(\n
),因此甚至不会读取您的y / q答案。
使用来自1.的解决方案替换fflush(stdin)
,或将fflush()+getchar()
替换为scanf("\n%c",&answer);
应解决该特定问题。