gcc и lccwin32: разные результаты

Я пытаюсь скомпилировать этот код:

#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, и он работает как положено. но проблема возникает, когда я меняю ОС на Linux (Ubuntu:pricise pangolin 12.04 LTS Desktop) и скомпилируйте его с помощью gcc.first, он, кажется, работает нормально, но до тех пор, пока не появится 20-я строка и приглашение, когда я поставлю аргумент (y для продолжения, q для выхода) и нажмите Enter, но ничего не происходит. это просто ускользнуло к elseчасть, которая снова запускает программу. Так это gcc, который у меня глючит, или мой код не подходит для gcc, или я что-то пропустил?

2 ответа

Я ненавижу сканф. Я бы предложил заменить scanf("%24s",name1) на fgets(s,24,stdin); (И затем, к сожалению, делает, если (s[strlen(s)-1] == '\n') s[strlen(s)-1] = '\0', чтобы избавиться от \ n в конце.

Я бы также предложил:

  1. Не использовать рекурсию на главной
  2. Используйте int main(int argc, char *argv[]), а затем передавайте имя вашего файла в качестве аргумента (так что вы должны проверить, что argc > 1, а затем использовать argv[1] в качестве имени файла, а затем при запуске программы сделать./programname имя файла)
  3. Все еще не использую scanf

В дополнение к проблемам, о которых сообщает @Foon, у вас также есть следующие проблемы:

  1. fflush (stdin) не работает так, как вы думаете.
  2. scanf () оставляет символ новой строки во входном буфере.

Ваша проблема в том, что есть еще перевод строки (\n) во входном буфере, когда вы вызываете getchar(), поэтому ваш ответ y/q даже не читается.

Замена fflush(stdin) с решением от 1., или заменой fflush()+getchar() с scanf("\n%c",&answer); должен решить эту конкретную проблему.

Другие вопросы по тегам