Inhalt eines Strings wird nicht gespeichert
-
Hallo ich hab folgendes Problem beim einlesen einer Zeichenkeet, der Wert wird nicht gespeichert.
{ int nKW; char* chBezeichnung; int ntueren; int km; }; //Prototypen int Liste(); int Loeschen(); int Aufrufen(); int Hinzufuegen(); int Ausgabe(int); int nSP=0; char temp[25]; struct PKW zPKW[100]; void main(void) { int nAuswahl; clrscr(); //Beispiele einlesen for(nSP=0;nSP<9;nSP++) { zPKW[nSP].nKW=nSP; zPKW[nSP].chBezeichnung="Auto"; zPKW[nSP].ntueren=5; zPKW[nSP].km=2300; } do { clrscr(); //Auswahlbildschirm do { clrscr(); gotoxy(1,1); printf("Auswahl:"); gotoxy(1,3); printf("1-Hinzuf�gen"); gotoxy(1,4); printf("2-Aufrufen"); gotoxy(1,5); printf("3-L”schen"); gotoxy(1,6); printf("4-Auflisten"); gotoxy(1,7); printf("5-Beenden"); gotoxy(1,8); scanf("%i",&nAuswahl); if((nAuswahl<1)||(nAuswahl>5)) { gotoxy(10,15); printf("Falsche Eingabe! Weiter durch Tastendruck!"); getch(); } } while((nAuswahl<1)||(nAuswahl>5)); clrscr(); //Auswahl switch(nAuswahl) { case 1 : Hinzufuegen(); break; case 2 : Aufrufen(); break; case 3 : Loeschen(); break; case 4 : Liste(); break; } } while(nAuswahl!=5); } //Hinzuf�gen eines Datensatzes int Hinzufuegen() { if(nSP<101) { gotoxy(1,3); printf("KW Leistung: "); scanf("%i",&zPKW[nSP].nKW); gotoxy(1,4); printf("Bezeichnung: "); scanf("%s",zPKW[nSP].chBezeichnung); gotoxy(1,5); printf("Anzahl T�ren: "); scanf("%i",&zPKW[nSP].ntueren); gotoxy(1,6); printf("Laufleistung (inTkm): "); scanf("%i",&zPKW[nSP].km); nSP++; getch(); } else { gotoxy(1,3); printf("Keine weiteren Eingaben m”glich,Speicher voll!"); getch(); } }
Der Haken liegt hier
printf("Bezeichnung: "); scanf("%s",zPKW[nSP].chBezeichnung);
Wenn ich hier einen Wert eingebe und dann nachher wieder auslesen möchte, dann
wird nur "(Null)" ausgegeben.
Woran kann das liegen, die anderern Werte stimmen alle?
-
Zum einen sehe nirgendwo die Stelle, wo Speicher für den char* reserviert wird, zum anderen, seit wann lassen sich Arrays durch bloße Zuweiung kopieren?
new und strncpy() sind Deine Freunde. Respektive in ANSI C müßte statt new wohl malloc verwendet werden.
-
hab vergessen die erste Zeile mit einzufügen, die lautet dann:
struct PKW { int nKW; char* chBezeichnung; int ntueren; int km; }; //Prototypen
Wie soll ich denn strncpy()verwenden? soll ich meinen String zuerst in ein Array einlesen und dann auf die Struktur übetragen?
-
strcpy();
kann ich nicht verwenden, es kommt ne fehlermeldung, dass ich zu viele Parameter habe,
ich denk mal das liegt daran, dass ich ne strucktur verwende
-
newbie@work schrieb:
strcpy();
kann ich nicht verwenden, es kommt ne fehlermeldung, dass ich zu viele Parameter habe,
ich denk mal das liegt daran, dass ich ne strucktur verwendeNö, das liegt daran, dass du strcpy falsch benutzt. Da du weder den Code noch die Fehlermeldung rausrückst, kann dir niemand sagen, was falsch ist.
Hast du denn inzwischen Speicher für den String reserviert? Ohne geht's nicht.
-
MFK schrieb:
Hast du denn inzwischen Speicher für den String reserviert? Ohne geht's nicht.
Wie soll ich denn den Speicher reservieren?
Und wozu muss ich das machen? Ich denk der wird in der Strucktur mit reserviert.
Zumindest behalten alle anderen Werte ihren Ihnalt bei.
Nur eben die Bezichnung verabschiedet sich.
-
newbie@work schrieb:
Wie soll ich denn den Speicher reservieren?
Mit malloc.
Und wozu muss ich das machen? Ich denk der wird in der Strucktur mit reserviert.
In der Struktur ist nur ein Zeiger. Speicher für einen Text hast du damit nicht.
Zumindest behalten alle anderen Werte ihren Ihnalt bei.
Nur eben die Bezichnung verabschiedet sich.Ja, so kann sich undefiniertes Verhalten bemerkbar machen. Kann aber auch sein, dass dir alles um die Ohren fliegt
-
Hier eine mögliche simple Lösung
typedef struct { int nKW; char* chBezeichnung; int ntueren; int km; // int InUse; } PkwSTRUCT; #define ANZELEMPkwSTRUCT 100 .... PkwSTRUCT zPKW[ANZELEMPkwSTRUCT]; int nSP; ... for(nSP=0;nSP<ANZELEMPkwSTRUCT;nSP++) { if (0!=(zPKW[nSP].chBezeichnung=(char *)calloc(81,sizeof(char))) //80 Zeichen im String { // Errorhandling da allokierung fehlschlägt printf("Error in calloc bei zPKW´in Element %i\n",nSp); } }
Sinnvoller wäre es, anstelle das ganze Feld vorzuinitialisieren, das calloc nach dem einlesen des Strings in einen Buffer mit der passenden Größe -sprich der Stringlänge+1 des buffers- durchzuführen, und nicht vergessen am Ende auch den Speicher mit free() wieder freizugeben.
Dus solltest eine Zähler mitführen in dem steht bis wohin das Array gefüllt ist, oder in der Struktur eine inUse Variable führen die 0 ist wenn das Feld nicht belegt ist und 1 falls sinnvolle Daten enthalten sind.
Noch effektiver wäre eine Array das dynmaisch mit den Anzahl wächst oder eine Liste mit den Daten