1

私はこのコードをコンパイルしようとします:

#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

注意: lcc-win32 などの別のコンパイラでこのコードを試してみましたが、問題なく動作します。

4

2 に答える 2

3

問題が何であるかわからない、これはコードの対になった q&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 でテストされました。

これがうまくいくかどうかを確認してください。

于 2012-06-28T15:57:44.360 に答える
2

問題は、fflush(stdin)標準化されておらず、システムごとに動作が異なることです。詳細については、 http://c-faq.com/stdio/stdinflush.htmlおよびhttp://c-faq.com/stdio/stdinflush2.htmlをご覧ください。

ここで何が起こっているか: 標準入力からデータを読み取るために使用しています。たとえば、ユーザーがファイル名を入力しscanf("%24s",name1);ます (たとえば、 . now containstest.cを押します。この場合、標準入力から最大 24 文字を読み取り、.呼び出しは削除されません。つまり、呼び出しは、説明されている動作を説明する stdin から読み取られます。Returnstdintest.c\nscanftest.c\nstdinstdin\nfflush(stdin)\nstdingetchar()\n

経時的な stdin の内容

  1. scanf:test.c\n
  2. scanf: \n- scanf が使用されtest.c、割り当てられましたname1
  3. fflush(stdin):\n
  4. After :読み取って返さgetchar()れたときは空ですgetchar\n

この正確な問題の詳細と、より適切な説明については、fflush vs. gets に関する c-faq エントリを参照してください。

于 2012-06-28T17:38:04.957 に答える