为啥编译器试图将 char * 转换为 char? [关闭]

Posted

技术标签:

【中文标题】为啥编译器试图将 char * 转换为 char? [关闭]【英文标题】: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 语言。 【参考方案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++;
    

【讨论】:

以上是关于为啥编译器试图将 char * 转换为 char? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法将“char (*)[6]”转换为“char**”

Java - 为啥 char 不应该被隐式转换为字节(和短)原语?

为啥将“0”添加到 int 数字允许转换为 char?

我试图将 char* 转换为 float*

为啥仅在某些情况下才能将字符串文字隐式转换为 char* ? [复制]

Oracle - 为啥将数字转换为 TO_CHAR 时数字的前导零会消失