gcc和lccwin32:结果不同

时间:2012-06-28 13:44:08

标签: windows linux gcc lcc-win32

我尝试编译此代码:

#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或者我可能错过了什么?

2 个答案:

答案 0 :(得分:1)

我讨厌scanf。我建议用fgets(s,24,stdin)替换scanf(“%24s”,name1); (然后不幸地做了if(s [strlen(s)-1] =='\ n')s [strlen(s)-1] ='\ 0'来摆脱最后的\ n。

我还建议:

     
  1. 不在main上使用递归  
  2. 使用int main(int argc,char * argv [])然后传递文件名作为参数(这样你就可以检查argc&gt; 1然后使用argv [1]作为参数文件名,然后在运行程序时执行./programname filename)  
  3. 仍未使用scanf

答案 1 :(得分:1)

除了@Foon报告的问题之外,您还遇到了这些问题:

  1. fflush(stdin) is not working正如您所想的那样。
  2. scanf() leaves the newline character in the input buffer
  3. 您的问题是,当您调用getchar()时,输入缓冲区中仍然存在换行符(\n),因此甚至不会读取您的y / q答案。

    使用来自1.的解决方案替换fflush(stdin),或将fflush()+getchar()替换为scanf("\n%c",&answer);应解决该特定问题。