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 行の内容を表示することです。Windows XP で lccwin32 を使用してコンパイルしたところ、期待どおりに動作しました。Ubuntu:pricise pangolin 12.04 LTS Desktopしかし、OS を Linux ( ) に変更して gcc でコンパイルすると問題が発生しyますq。しかし、何も起こりません。それはプログラムを再開している部分に滑り落ちただけですelse.gccにバグがありますか、コードがgccに合わないのでしょうか、それとも何かを見逃したのでしょうか?

4

2 に答える 2

1

@Foon によって報告された問題に加えて、次の問題もあります。

  1. fflush(stdin) は、思ったように機能しません。
  2. scanf() は改行文字を入力バッファーに残します

あなたの問題は、\ngetchar() を呼び出すときに入力バッファーにまだ改行 () があるため、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); に置き換えることをお勧めします。(そして残念ながら、最後の \n を取り除くために if (s[strlen(s)-1] == '\n') s[strlen(s)-1] = '\0' を実行します。

私もお勧めします:

  1. メインで再帰を使用しない
  2. int main(int argc, char *argv[]) を使用してから、ファイルの名前を引数として渡します (したがって、argc > 1 であることを確認してから、ファイル名として argv[1] を使用し、プログラムを実行するときにdo ./programname ファイル名)
  3. まだscanfを使用していません
于 2012-06-28T14:03:48.267 に答える