为啥编译器试图将 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]
这是char
s 的数组
我正在传递char
s 的数组。
我尝试添加*
和&
,我认为这也没有意义,但它仍然不起作用。
谁能帮我理解这个?
【问题讨论】:
这是 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 不应该被隐式转换为字节(和短)原语?