strcmp和fscanf带有While循环文件

时间:2018-01-29 06:19:00

标签: c while-loop scanf strcmp

我遇到了一个特定的代码行,它给我的错误是

  

错误:从‘int’‘const char*’

的转换无效      

错误:初始化‘int strcmp(const char*, const char*)’

的参数1

有谁碰巧知道为什么?这是有问题的代码行。

while (strcmp(fscanf(fr, "%s", words),"DONE") != 0)

基本上,我的代码会扫描一个文件(执行某些操作),直到它到达" DONE"的关键字。 (不带引号),退出文件。我是一名初学C程序员,因此请原谅代码中的任何不准确/效率低下。

完整的代码如下。

#include <stdio.h>
#include <string.h>

FILE *fr;


struct player {

     char name[50];
     float DOC;

};

struct player players[50];


int main() { 


     fr = fopen ("playerinfo.txt", "r");

     if(ftell(fr) == 0) {
          fclose(fr);
          printf("PLAYER FILE IS EMPTY");
          return 0;
     }

     char words[50];

     while (strcmp(fscanf(fr, "%s", words),"DONE") != 0) {

         float pts;
         fscanf(fr, "%f", pts);

         float asts;
         fscanf(fr, "%f", asts);

         float mins;
         fscanf(fr, "%f", mins);

         struct player *aPlayer;
         float theDOC = (pts + asts) / mins;
         strcpy(aPlayer->name, words);
         aPlayer->DOC = theDOC;


}

     fclose(fr);


     return 0;
}

2 个答案:

答案 0 :(得分:2)

在您的代码中,

  strcmp(fscanf(fr, "%s", words),"DONE")

不符合您的想法。 fscanf()不返回指向扫描的字符串的指针,而是返回计数(int类型)。你的编译器警告过你。的 Read the man page before you proceed.

这种不正确的用法会导致警告。

那就是说,你必须检查scanf()系列函数是否成功,否则你很有可能最终使用不确定的值(想想words的内容,如果扫描失败)。

因此,您将操作分为两部分。

  • 使用fgets() / fscanf()来获取输入(换行符,如果需要)。检查通话是否成功。
  • 将输入缓冲区与所需字符串(strcmp())进行比较。

那就是说,我真的没有看到整个循环的重点,因为每次进入循环时你都会创建一个新的局部变量aPlayer。我希望你知道你在做什么。

忽略上述情况,通用流程应该类似于

input = "Not Done";
while ('input' is not "Done")
     scan values;
     check for succss;
     store into variables;
     scan next 'input'

答案 1 :(得分:1)

问题在于你的strcmp()函数。的确,当你这样做时:

strcmp(fscanf(fr, "%s", words),"DONE")

您将fscanf(这是一个int)的返回值与const char *&#34; DONE&#34;进行比较。这是不可能的。您需要直接将words"DONE"进行比较。

您应该执行以下操作:

int test;
test = fscanf(fr, "%s", words);
while ((test != EOF) && (strcmp(words,"DONE") != 0)) {

         float pts;
         fscanf(fr, "%f", pts);

         float asts;
         fscanf(fr, "%f", asts);

         float mins;
         fscanf(fr, "%f", mins);

         struct player *aPlayer;
         float theDOC = (pts + asts) / mins;
         strcpy(aPlayer->name, words);
         aPlayer->DOC = theDOC;

         test = fscanf(fr, "%s", words);
}