【问题标题】:Why fgets doesnt work in this scenario, where scanf works?为什么 fgets 在这种情况下不起作用,而 scanf 起作用?
【发布时间】:2020-10-06 03:08:55
【问题描述】:

在下面的代码中,我使用 fgets 来保存字符串的输入。使用 fgets 在我的搜索函数 display() 上获得所需的 strcmp() 将不起作用,但使用 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) ; 
          }
     }
 }

【问题讨论】:

  • 那么你的意思是,当我用 fgets 输入时,它会在最后保存带有“\n”的字符串?
  • @Atheros fgets 文档解释了这一切。
  • 旁白:请初始化searchfor 例如char searchfor[30] = ""; 以便对strcmp 的第一次调用有效。

标签: c scanf fgets strcmp


【解决方案1】:

经过一番研究,我意识到了这个问题,所以我在这里发布了我的发现。

仔细查看文档,它解释了fgets从当前流位置读取字符到 包括第一个换行符 , 到流的末尾,或者直到读取的字符数等于 numChars - 1 。

所以解析 searchfor 变量 ,用 "end" ,存储在 (buffer)searchfor 变量在我使用 scanf() 时是“end”,但在我使用 fgets() 时是“end\n”。那是因为 searchfor[30] 中有足够的空间来包含换行符。

因此,strcmp() 会将 "end" 与 "end\n" 进行比较,结果永远不会返回 0。 所以我的问题的解决方案是我要么使用 scanf() 进行解析,要么从解析的变量中删除换行符“\n”。

【讨论】:

    猜你喜欢
    • 2017-11-26
    • 2010-12-29
    • 1970-01-01
    • 2021-08-05
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多