[Novize] struct - struct variable einen String zuweisen
-
Hey Leute,
Bin beim Thema Strukturen angelangt und wollte da bisschen was rumspielen und folgendes geschrieben:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdarg.h> int main(void) { struct attribute { int str; int agi; int mag; int stm; }stats; struct enemy { int health; char name[50]; int experience; struct attribute stats; }; struct enemy goblin; goblin.health = 20; goblin.name[50] = "Goblin"; goblin.experience = 4; goblin.stats.str = 2; goblin.stats.agi = 4; goblin.stats.mag = 0; goblin.stats.stm = 1; printf("%s has %d health and gives %d experience on kill.", goblin.name, goblin.health, goblin.experience); return 0; }
Leider failed die Ausgabe an der Stelle des Strings für goblin.name...
habe folgendes alles ausprobiert:
goblin.name[50] = "Goblin";
goblin.name = "Goblin";
goblin.name[0] = "Goblin";alles ohne Erfolg - muss ich da irgendwie mit nem pointer arbeiten ala pGoblin->name ??
PS: Die initialisierung struct enemy goblin = { 10, "Goblin", 4 };
funktinoniert einwandfrei.gruß Charlie
-
strcpy/strncpy sollten es tun.
-
Und eine andere simplere Lösung ist nicht möglich?!
-
Wenn die Strings hartgecoded sind, kannst du als Strukturmember char* nehmen,
dann funktionieren Zuweisungen wie goblin.name = "Goblin" problemlos.Hat das einen bestimmten Grund, warum du deine Strukturen innerhalb der main versteckst?
-
Da es nichts großartiges werden soll eigentlich nicht - jedoch kenne ich auch nicht die Alternative dazu - darum enthalte ich mich hier erstmal
-
Wenn du deine Strukturen innerhalb von main deklarierst, kannst du sie auch nur innerhalb von main benutzen.
Eine Alternative ist, die Strukturdeklaration außerhalb von main zu schreiben.#define NAMELEN_MAX 15 struct enemy { int health; char name[NAMELEN_MAX+1]; int experience; }; int main (void) { struct enemy goblin = {0}; strncpy ( goblin.name, "Goblin", NAMELEN_MAX ); return 0; }
-
Falke88 schrieb:
alles ohne Erfolg - muss ich da irgendwie mit nem pointer arbeiten ala pGoblin->name
"Irgendwie" schon.
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdarg.h> int main(void) { struct attribute { int str; int agi; int mag; int stm; }stats; struct enemy { char name[50]; int health; int experience; struct attribute stats; }; struct enemy goblin; goblin = *(struct enemy*)"Goblin"; goblin.experience = 4; goblin.health = 20; goblin.stats.str = 2; goblin.stats.agi = 4; goblin.stats.mag = 0; goblin.stats.stm = 1; printf("%s has %d health and gives %d experience on kill.", goblin.name, goblin.health, goblin.experience); return 0; }
Und wenn du mir jetzt noch sagst, ob und wenn ja wo hier warum UB vorliegt, hättest du bestanden.
Compound statements wären auch noch eine Möglichkeit für solche Fälle, aber erst C99.
-
Wutz schrieb:
goblin = (struct enemy)"Goblin";
was soll denn der schrott?
-
Oh, har, har. Hör auf, solche Wölfe zu bauen, sonst macht dir das noch jemand nach.
Ernsthafter Vorschlag:
struct attribute { int str; int agi; int mag; int stm; }; struct enemy { int health; char name[50]; int experience; struct attribute stats; }; struct enemy goblin = { 20, "Goblin", 4, { 2, 4, 0, 1 } };