为什么我在c语言中得到错误无效转换从'char'到'const char''

时间:2014-12-16 04:53:24

标签: c

这是一个包含变量

的结构
    struct theFile{

        FILE *fPointer;
        char *fileItems[];
        int count;
    }myFile;

我想知道为什么当我有这样的代码时,我从“char”到“const char *”的错误无效转换

    void saveFile(){

        myFile.fPointer = fopen("mileage.txt", "r");
        char item;
        int i = 0;

        while (!feof(myFile.fPointer)){
            item = fgetc(myFile.fPointer);
            while (item != ',' || item != ' '){
                myFile.fileItems[i] = (char*)malloc(sizeof(char));
                strcpy(myFile.fileItems[i], item);
                i++;
                item = fgetc(myFile.fPointer);              
            }
            myFile.count++;
        }
    }

但是当我将项目作为指针

时,我没有错误
     void saveFile(){

        myFile.fPointer = fopen("mileage.txt", "r");
        char *item;
        int i = 0;

        while (!feof(myFile.fPointer)){
            *item = fgetc(myFile.fPointer);
            while (*item != ',' || *item != ' '){
                myFile.fileItems[i] = (char*)malloc(sizeof(char));
                strcpy(myFile.fileItems[i], item);
                i++;
                *item = fgetc(myFile.fPointer);             
            }
            myFile.count++;
        }
}

3 个答案:

答案 0 :(得分:1)

我看到的问题:

问题1:

struct theFile{
    FILE *fPointer;
    char *fileItems[];
    int count;
}myFile;

无效。灵活的数组成员必须是struct的最后一个成员。使用

struct theFile{
    FILE *fPointer;
    int count;
    char fileItems[]; // This is an array of char not an array of char*.
}myFile;

代替。

问题2:

strcpy(myFile.fileItems[i], item);

无效,因为第二个参数的类型为char而不是char*。这就是编译器告诉你的内容。

问题3:

您需要更新代码,以便灵活地将输入数据添加到myFile

void saveFile()
{
   int item;
   int i = 0;

   myFile.fPointer = fopen("mileage.txt", "r");

   // Deal with error condition.
   if ( myFile.fPointer == NULL )
   {
       // Add an appropriate error message.
       printf("Unable to open '%s' for reading.\n", "mileage.txt");
       return;
   }

   myFile.fileItems = malloc(i+1);

   while ((item = fgetc(myFile.fPointer)) != EOF )
   {
      if (item != ',' || item != ' ')
      {
         myFile.fileItems = realloc(myFile.fileItems, i+1);
         myFile.fileItems[i] = item;
         i++;
      }
   }
   myFile.count = i;

   // You need to call fclose(myFile.fPointer) somewhere.
   // I am not sure what's the best place in your program to do that.
   // This function might as well be that place.
   fclose(myFile.fPointer);
   myFile.fPointer = NULL;
}

问题4:

名称saveFile似乎有点误导,因为您没有将任何内容保存到文件中。 readFile听起来对我来说是一个更好的名字。

答案 1 :(得分:0)

strcpy是一个char *参数。在第一种情况下,您传递的是字符变量。所以它不接受并抛出错误。

char *strcpy(char *dest, const char *src); 

因此,当您使用指针时,它会接受它。

答案 2 :(得分:0)

您将单个字符与字符串混淆。此外,两个版本的代码都在写入未分配的内存。

我没有尝试详细解释这一点,而是建议你回到你从中学习C的书,因为你已经误解了一些非常基本的东西。这里。