【问题标题】:Why is the compiler trying to convert char * into char? [closed]为什么编译器试图将 char * 转换为 char? [关闭]
【发布时间】:2021-11-09 06:46:29
【问题描述】:

由于字符串/char 数组,我无法实例化结构。

这是我的结构:

struct Drink {
    char name[10];
    int volume;
    double price;
    int quantity;
};

这是我得到错误的地方:

void loadDrinksFromFile(const char* filename) {
    FILE *fp;
    fp = fopen(filename, "r");
    int count = 0;
    char name[10];
    int volume;
    double price;
    int quantity;

    while (fscanf(fp, "%s %d %lf %d", name, &volume, &price, &quantity) != EOF) {
        // name is the cause of the error
        machine[count++] = Drink{ name, volume, price, quantity };
    }
    fclose(fp);
}

上面写着a value of type char * cannot be used to initialize the entity of type char。 为什么我的代码首先尝试接收 char 类型? 我的结构期待char name[10] 这是chars 的数组 我正在传递chars 的数组。 我尝试添加*&,我认为这也没有意义,但它仍然不起作用。

谁能帮我理解这个?

【问题讨论】:

  • 这是 C 还是 C++?
  • 固定长度的数组复制从未成为标准的 C 语言。

标签: c++ arrays c string struct


【解决方案1】:

因为 C 和 C++ 都不支持直接分配现有的原始数组。两者都允许使用初始化列表 {x,y,z...} 或字符串文字来初始化数组。

例如int foo[] = {1,2,3}; 可以,但int foo[12]{}; int bar[12]=foo; 不行。

只需使用std::array<T,N>,因为它具有所需的语义。或者对于 char 数组,std::string 更好。

【讨论】:

    【解决方案2】:

    如果您尝试使用复合字面量,语法看起来就像一个强制转换后跟一个初始化列表:

    machine[count++] = (struct Drink){ name, volume, price, quantity };
    

    但是,这仍然行不通,因为数组不能用作初始化器。

    在这种情况下,您最好直接从fscanf 写入结构字段。

        while (fscanf(fp, "%s %d %lf %d", machine[count].name, &machine[count].volume, 
                      &machine[count].price, &machine[count].quantity) == 4) {
            count++;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多