string in record
-
hallo,
folgendes Problem wird wohl für viele sehr banal sein und ein
entlocken, aber ich habe das aus einem C-Skript. Wenn es so nicht funktioniert, wüßte ich gerne, wie man Strings sonst in Records aufnimmt und händelt.
danke im Voraus.
#include <stdio.h> typedef struct{ char ort[20]; int plz; char strasse[40]; int hausnummer; }tTest; int main(){ char dummy; tTest adresse; //adresse.ort="stuttgart"; geht nicht,wieso??? adresse.plz=43322; //adresse.strasse="bahnhofstr."; geht nicht,wieso??? adresse.hausnummer=5; //printf("Ort:%s\n",adresse.ort); printf("PLZ:%d\n",adresse.plz); //printf("Strasse:%s\n",adresse.strasse); printf("Hausnummer:%d\n",adresse.hausnummer); scanf("%c",&dummy); }
-
strcpy() oder strncpy()
und natuerlich
#include <string.h>
Dann klappt das.
-
Nun, hast du dir denn jemals die Grundlagen der Zeichenkettenbehandlung in C angesehen? Ist leider etwas kompliziert und wohl die größte Hürde für Anfänger, aber eigentlich sollte unmittelbar klar sein, wieso
char x[20]; x= "Bla!";
nicht möglich ist. Woraus ich folgere, dass du die Grundlagen von Zeichenkettenbehandlung wohl nicht angesehen hast Das wäre aber sehr nützlich, wenn man mit Zeichenketten hantiert
. Dies ist genau die Art Stoff, für den Lehrbücher geschrieben wurden. Nicht die Art Stoff, die man in einem Forenbeitrag ausführlich lehren kann.
Außerdem ist meine Adresse:
Max Mustermann
Lange Musterstraße 23a
01219 Dresden Leubnitz-NeuostraIch glaube ich hätte ein Problem, wenn ich dein Programm benutzte. Nicht nur eines.
-
@gigg:
<string.h> hat leider nicht funktioniert.@SeppJ:
natürlich habe ich mir die Zeichenkettenbehandlung in C angesehen.
Mir ist klar, dass(um auf dein Bsp einzugehen) aberchar x[20]="Bla!";
funktioniert.
Aber in meinem Fall steht im meinem C-Skript, dass in der von mir oben angegebenen Art und Weise Records erstellt werden können.
Und mit adresse.ort="stuttgart"; sollte man die Variable adresse vom Typ Record eigentlich mit "stuttgart" füllen können. Laut Skript.Wie fügt ihr Char-Komponenten wie Ort und Strasse in Records ein und wie initialisiert ihr diese mit strings?
Anstatt mir ausführlich zu sagen, wie es nicht geht, wäre ein einfaches Beispiel doch sinnvoller oder?Und das Adressen-Programm war nur ein Test hierfür und nicht relevant.
-
blacksun schrieb:
Anstatt mir ausführlich zu sagen, wie es nicht geht, wäre ein einfaches Beispiel doch sinnvoller oder?
Hat gigg dir schon gesagt. "Funktioniert nicht" ist keine Fehlerbeschreibung.
blacksun schrieb:
@SeppJ:
natürlich habe ich mir die Zeichenkettenbehandlung in C angesehen.
Mir ist klar, dass(um auf dein Bsp einzugehen) aberchar x[20]="Bla!";
funktioniert.
Verstehst du denn, warum
char x[20]="Bla!";
funktioniert, aber
char x[20]; x= "Bla!";
nicht? Wohl nicht, denn sonst hättest du giggs Lösung verstanden.
Und mit adresse.ort="stuttgart"; sollte man die Variable adresse vom Typ Record eigentlich mit "stuttgart" füllen können. Laut Skript.
Dann ist das Script ein Fall für den Mülleimer. Und zwar sofort, bevor du daraus noch mehr Unsinn lernst. Im Forum findest du Ratschläge für gute Lehrbücher.
-
blacksun schrieb:
//adresse.ort="stuttgart"; geht nicht,wieso???
Weil ort ein Array ist und Arrays unmodifiable lvalues sind.
Du kannst aber Stringliterale bei der Initialisierung deiner struct-Variablen vorgeben:
tTest a1 = {"stuttgart",43322,"bahnhofstr.",5};
ab C99 auch mit
designated initializers
tTest a2 = {.ort="stuttgart",.plz=43322,.strasse="bahnhofstr.",.hausnummer=5};
Ab C99 funktioniert auch außerhalb einer Initialisierung mit compound literals:
a2 = (tTest){.ort="stuttgart",.plz=43322,.strasse="bahnhofstr.",.hausnummer=5};
Felder kannst du so auch einzeln setzen
a2 = (tTest){.strasse="bahnhofstr."};
der Haken ist dabei aber, dass alle nicht angegebenen Felder mit 0 besetzt werden.
Bei diesen Zuweisungen musst du immer auf die Arraygröße achten, die muss mind. strlen("Literal")+1 betragen.Alternativ kannst du statt Array auch Zeiger in der struct benutzen, sinnvoll ist das aber nur für Literale (zur Compilezeit bekannte konstante Strings):
typedef struct{ char *ort; int plz; char *strasse; int hausnummer; }tTest; /* Da klappt es dann auch mit deiner Einzelzuweisung: */ tTest adresse; adresse.ort="stuttgart";
-
Wutz schrieb:
Alternativ kannst du statt Array auch Zeiger in der struct benutzen, sinnvoll ist das aber nur für Literale (zur Compilezeit bekannte konstante Strings):
Eigentlich ist das doch das einzig sinnvolle Design, wenn man sich nicht auf eine feste Länge beschränken will. Wir wollen doch nicht die Leute aus "Kirchheimbolanden-Schillerhain" ausschließen.
-
Hallo,
wollte mich bei allen bedanken. hat nun geklappt.
Und mein Skipt war nicht falsch. Habe aus einem Beispiel kunde.anzahl=345 irgendwie für mich gefolgert, dass auch kunde.adresse="blabla" möglich sei, obwohl das nirgends stand.
also nochmals danke.