0

我尝试编译这段代码:

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

4

2 回答 2

1

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

  1. fflush(stdin) 没有像你想象的那样工作。
  2. scanf() 将换行符留在输入缓冲区中。

您的问题是,当您调用 getchar() 时,输入缓冲区中仍有换行符 ( \n),因此您的 y/q 答案甚至没有被读取。

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

于 2012-06-28T15:57:10.470 回答
1

我讨厌scanf。我建议将 scanf("%24s",name1) 替换为 fgets(s,24,stdin); (然后不幸的是, if (s[strlen(s)-1] == '\n') s[strlen(s)-1] = '\0' 最终摆脱了 \n 。

我还建议:

  1. 不在 main 上使用递归
  2. 使用 int main(int argc, char *argv[]) ,然后将文件名作为参数传递(因此您将检查 argc > 1 然后使用 argv[1] 作为文件名,然后在运行程序时做 ./programname 文件名)
  3. 仍然没有使用 scanf
于 2012-06-28T14:03:48.267 回答