当使用gets来获取C中的文件名时,文件会打开,但是当使用fgets时它不会

我在C中尝试从用户输入中获取字符串,以便程序可以打开所选文件。
我尝试使用fgets,因为我在很multithreading上读到它是更安全的选项(而不是获取)。
但是,当使用gets存储字符串时,文件会打开,但是fgets不会。

这是我正在使用的代码:

char csvFile[256]; FILE *inpfile; printf("Please enter CSV filename: "); fgets(csvFile,256,stdin); printf("\nFile is %s\n",csvFile); inpfile = fopen(csvFile,"r"); if(inpfile == NULL) { printf("File cannot be opened!"); } 

我知道文件存在,但是fgets输入了if块。
唯一的区别是使用:

 gets(csvFile); 

取代的

 fgets(csvFile,256,stdin); 

任何人都可以帮我理解这个吗? 提前致谢。

您需要删除尾随换行符:

 char csvFile[256], *p; fgets(csvFile, sizeof csvFile, stdin); if ((p = strchr(csvFile, '\n')) != NULL) { *p = '\0'; /* remove newline */ } 

您可以通过在句子的第一个和结尾分别添加两个“=”来检查csvFile末尾的换行符。

 printf("\n=File is %s=\n",csvFile); 

您可以使用库中的strtok()函数轻松删除csvFile末尾的换行符。 因此,您可能需要在以下列方式使用fgets()读取输入字符串后添加一行代码:

 fgets(csvFile, sizeof csvFile, stdin); strtok(csvFile, "\n"); 

您在fgetsgets之间观察到的差异是fgets将换行符留在读取字符串的末尾。 但它不应该让你回到gets – 只要删除csvFile中的最后一个字符,如果它是换行符。