Почему fgets не работает в этом сценарии, где работает scanf? - PullRequest
0 голосов
/ 16 июня 2020

В приведенном ниже коде я использую fgets для сохранения ввода для строки. С fgets желаемый strcmp () в моей функции поиска display () не будет работать, но с scanf () он работает. Почему это происходит?

int main(){

 char end[]="end" ;
 FILE *file ; 
 char searchfor[30] ;

   if( (file=fopen("c:\\Users\\Konpoul\\Desktop\\GrGames.txt", "r")) ==NULL   ){
        printf("cannot open file");
        exit(1) ;
    }

    fileRead(file) ;  // This is a function 

    while( strcmp(searchfor,end) !=0 ){ 
    fgets(searchfor,sizeof(searchfor),stdin) ; 
    //scanf("%s",&searchfor) ; 
    display( searchfor) ;     // Inside this function I strcmp(a_name , searchfor)
    }
     printf("end") ; 
}

Вот функция отображения, которая не работает должным образом

 void display(char *name){
     for(int i =0 ; i<N ; i++){
         if( strcmp(player[i].name , name )==0 ){
             printf("Name :%s  date: %d  Goals: %d  Meters Runned: %d  Time played : %f" ,player[i].name ,player[i].date ,player[i].goals,player[i].passes ,player[i].timepl) ; 
          }
     }
 }

1 Ответ

0 голосов
/ 18 июня 2020

После небольшого исследования я осознал проблему, поэтому я публикую здесь свои выводы.

Внимательно изучив документацию, она объясняет, что fgets считывает символы из текущей позиции потока в и , включая первый символ новой строки , до конца потока или до тех пор, пока количество прочитанных символов не станет равным numChars - 1.

Итак, анализ переменная searchfor , с "end", то, что сохраняется в (буфере) переменной searchfor, - это "end", когда я использую scanf (), но "end \ n", когда я использую fgets (). Это потому, что в searchfor [30] достаточно места для включения символа новой строки.

Таким образом, strcmp () будет сравнивать «end» с «end \ n», никогда не возвращая 0 в результате. Поэтому решение моей проблемы состоит в том, что я либо использую scanf () для синтаксического анализа, либо удаляю символ новой строки "\ n" из анализируемой переменной.

...