Je fais mes devoirs. Nous devons créer une matrice avec un nouveau type de structure.
#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
}
Quand j'essaye de la compiler, cela montre des erreurs
[Erreur] types incompatibles lors de l'attribution du type 'char * [10]' à partir du type'char * '
Comment y remédier?
3 Réponses :
Vous ne pouvez pas le faire de cette façon car votre NAME et votre ID sont des tables de pointeurs vers le caractère
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
}
ou
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
}
ou
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
}
Je pense que votre typedef ne vous aide pas à comprendre le problème.
user[0][0].Name="Charles";
Ici, vous avez écrit String Name [10] qui est l'équivalent de char * Nom [10] qui est un tableau de pointeur sur char.
typedef char* String; String Name[10];
Ici, vous assignez la valeur Charles (qui peut être compris comme un caractère *) à une variable de type char * []
De plus si vous souhaitez attribuer une valeur de char * (en supposant que vous avez résolu le premier problème), vous pouvez utiliser strcpy ou strdup par exemple, (si vous utilisez strcpy n'oubliez pas de malloc )
J'espère que vous comprenez
Oui, mais strcpy ne résoudra pas non plus ce problème particulier. De son côté, bien que strdup puisse convenir ici, il ne produit pas de résultat plus assignable à user [0] [0] .Name qu’une chaîne littéral.
Comme @KillianG. déjà répondu, il semble que vous ayez peut-être brouillé le problème en définissant et en utilisant le type String . En général, il a tendance à être plus nuisible qu'utile de définir des types qui masquent la nature du pointeur, comme celui-là.
Je pense que le problème le plus profond ici est que vous avez défini votre structure de données différemment de ce que vous vouliez faire. Étant donné le type
data user[3][3]; // This: strcpy(user[0][0], "Charles");
Vous pourriez écrire un code comme celui-ci ...
char Name[10];
... mais votre structure n'est pas analogue:
String Name; // equivalent to: char *Name;
Vous avez défini le membre Name comme étant un tableau de String s , donc dix pointeurs, alors que cela semble probable que vous voulez plutôt un tableau de char , adapté pour contenir une chaîne C:
typedef struct {
char Name[10];
char ID[6];
float yo;
} data;
Alternativement, peut-être que vous voulez Name code > pour être une seule chaîne, auquel cas vous devez la déclarer de cette façon:
typedef struct{
String Name[10];
String ID[6];
float yo;
}data;
Il n'y a pas besoin ni possibilité de définir une longueur de chaîne maximale dans ce dernier cas, car une telle chose n'est pas un attribut d'un char * ; la longueur d'une chaîne C est une fonction des données de caractères, pas du tableau les contenant.
Supposons que vous choisissiez la première alternative,
String a_name = "Alice";
Maintenant, vous devez gérer le fait que C ne fournit pas d'opérateur pour la copie d'un tableau entier. En particulier, l'opérande de gauche d'un opérateur = ne peut pas être un tableau entier. Au lieu de cela, vous pouvez remplir des tableaux élément par élément, ou via diverses fonctions qui ont cet effet ( memcpy , memmove ). Il existe une sous-famille de ces fonctions spécifiques à la copie de données de chaîne: strcpy , strncpy , etc. .. Étant donné que la chaîne String ! ) "Charles" est connu pour ne nécessiter que 8 caractères, y compris son terminateur, la manière idiomatique de copier ces données dans des données existantes Le membre serait via Name de l'objet strcpy():
typedef char* String;
Vous ne pouvez pas attribuer comme ça. Utilisez
strcpy.De plus, votre déclaration devrait probablement être
String Name;sinon vous avez un tableau de pointeurs et non un tableau de caractères.@Tiara dans ma réponse vous avez 3 façons de le "réparer"
Ne cachez jamais les pointeurs derrière un typedef. Et ne prenez jamais la classe CS50 ...
@JohnnyMopp:
String Name;signifie queNameest un pointeur verschar, unchar * < / code> et " pas un tableau de caractères ".@JohnnyMopp j'ai écrit
String Name;et cela résout mon problème. Je vous remercie