我正在做作业。我们必须使用新型struct制作矩阵。
#include<stdio.h>
typedef char* String;
typedef struct{
String Name[10];
String ID[6];
float yo;
}data;
int main(){
data user[3][3];
// some code
// wanna assign value
user[0][0].Name="Charles";
user[0][0].ID="123123";
user[0][0].yo=20;
// another code
}
当我尝试编译它时,它显示错误
从'char *'类型分配给'char * [10]'类型时出现[错误]不兼容的类型
如何解决?
答案 0 :(得分:3)
我认为您的typedef不能帮助您理解问题。
typedef char* String;
String Name[10];
在这里您写了String Name[10]
,相当于char *Name[10]
,它是char上的指针数组。
user[0][0].Name="Charles";
此处您正在将值Charles
(可以理解为char *)辅助为类型为char *[]
的变量
此外,如果您想分配一个char *
值(假设您解决了第一个问题),则可以使用strcpy
或strdup
,例如(如果使用{{1 }}别忘了strcpy
)
希望您能理解
答案 1 :(得分:0)
@KillianG。已经回答,看来您可能已经通过定义和使用String
类型为自己解决了这个问题。总的来说,定义伪装指针性质的类型往往比有害的有益。
我认为这里最深的问题是,您对数据结构的定义与您打算进行的定义不同。给定类型
typedef char* String;
您可以编写这样的代码...
String a_name = "Alice";
...但是您的结构不相似:
typedef struct{ String Name[10]; String ID[6]; float yo; }data;
您已将Name
成员定义为String
s 的数组,因此有十个指针,而您似乎想要的是{{1 }},适合存放一个C字符串:
char
或者,也许您希望typedef struct {
char Name[10];
char ID[6];
float yo;
} data;
是单个字符串,在这种情况下,您应该这样声明:
Name
在后一种情况下,没有必要或没有能力设置最大字符串长度,因为这样的事情不是 String Name;
// equivalent to: char *Name;
的属性; C字符串的长度是字符数据的函数,而不是包含它们的数组的函数。
让我们假设您选择第一种选择,
char *
现在,您必须处理以下事实:C没有为整个数组复制提供运算符。特别是 char Name[10];
运算符的左操作数不能是整个数组。取而代之的是,您可以逐个元素地填充数组,也可以通过具有这种效果的各种函数(=
,memcpy
)填充数组。有一个专门针对复制字符串数据的功能的子家族:memmove
,strcpy
, etc ..鉴于字符串(不是strncpy
! )String
仅需要8个字符(包括其终止符),将数据复制到现有"Charles"
对象的data
成员中的惯用方式是通过{{1 }}:
Name
答案 2 :(得分:-2)
您不能这样做,因为NAME
和ID
是指向char的指针表
int main(){
data user[3][3];
// some code
// wanna assign value
user[0][0].Name[0]="Charles";
user[0][0].ID[0]="123123";
user[0][0].yo=20;
// another code
}
或
typedef char* String;
typedef struct{
String Name;
String ID;
float yo;
}data;
int main(){
data user[3][3];
// some code
// wanna assign value
user[0][0].Name="Charles";
user[0][0].ID="123123";
user[0][0].yo=20;
// another code
}
或
typedef char* String;
typedef struct{
char Name[10];
char ID[7];
float yo;
}data;
int main(){
data user[3][3];
// some code
// wanna assign value
strcpy(user[0][0].Name,"Charles");
strcpy(user[0][0].ID,"123123");
user[0][0].yo=20;
// another code
}