PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : char* aus einer structur


StoreMaster
21.04.2002, 11:26
versuch grad von java auf c umzusteigen...


struct feld {
char *name;
char *nachname;
int alter;
}eins[COUNT];

for(i = 0; i<COUNT; i++) {
char *name, *nachname;
int alter;
printf(&quot;\nEingabe Nr.%d\n------------\n&quot;, i+1);
printf(&quot;Name : &quot;); scanf(&quot;%s&quot;, &name);
printf(&quot;Nachname: &quot;); scanf(&quot;%s&quot;, &nachname);
printf(&quot;Alter : &quot;); scanf(&quot;%d&quot;, &alter);
eins[i].name = name;
eins[i].nachname = nachname;
eins[i].alter = alter;
}

so fülle ich das ganze. ist das so richtig?


datei = fopen(DATEI, &quot;w&quot;);
if(datei == NULL) {
printf(&quot;Speichern fehlgeschlagen....&quot;);
}
else {
int k;
for(k = 0; k<COUNT; k++) {
char *name, *nachname/*, *alter*/;
int j = strlen(eins[k].name);
printf(&quot;Die Laenge betraegt %d&quot;, j);
name[] = eins[i].name;
nachname = eins[i].nachname;
//alter = eins[i].alter;
fprintf(datei, &quot;Name: %s\n&quot;, name);
fprintf(datei, &quot;Nachname: &quot;);
//fprintf(datei, alter);
}
fclose(datei);
}

und so will ich das ganze auslesen und in eine datei schreiben. geht aber nicht. was mach ich hier dezidiert falsch, bzw. wie gehört das richtig?


DerWolf
21.04.2002, 18:54
Ich kann net gut c++ deshalb kann ich dir auch net genau sagen was falsch is, aber ich würd das ganze so schreiben:
struct feld {
char name[255];
char nachname[255];
int alter;
}eins[COUNT];

void lese() {
for(int i = 0; i<COUNT; i++) {
printf(&quot;\nEingabe Nr.%d\n------------\n&quot;, i+1);
printf(&quot;Name : &quot;); scanf(&quot;%s&quot;, &eins[i].name);
printf(&quot;Nachname: &quot;); scanf(&quot;%s&quot;, &eins[i].nachname);
printf(&quot;Alter : &quot;); scanf(&quot;%d&quot;, &eins[i].alter);
}
}

void schreibe() {
FILE *datei;
datei = fopen(&quot;d:\\test.txt&quot;, &quot;w&quot;);
if(datei == NULL) {
printf(&quot;Speichern fehlgeschlagen....&quot;);
}
else {
int k;
for(k = 0; k<COUNT; k++) {
int j = strlen(eins[k].name);
printf(&quot;Die Laenge betraegt %d&quot;, j);
fprintf(datei, &quot;\nName: %s\n&quot;, eins[k].name);
fprintf(datei, &quot;Nachname: \n&quot;, eins[k].nachname);
fprintf(datei, &quot;Alter: %d\n&quot;, eins[k].alter);
}
fclose(datei);
}
}
cu

xOOn
21.04.2002, 19:48
also der code von DerWolf sieht auf den ersten blick ok aus (dh ich habe keinen fehler gefunden :D :D :D )

@StoreMaster

also
char *nachname;
ist KEIN string in c++, den du einfach zuweissen kannst!

das ist ein zeiger, und zeiger muessen auf einen speicherbereich zeigen!
du musst den char * entweder vor dem benutzen anlegen oder darauf ein feld machen (wie es DerWolf gemacht hat char nachname[255];) anlegen geht mit nachname = new char [255];

int j = strlen(eins[k].name);

wuerde ich grundsaetzlich ausserhalb der schleife anlegen, im grunde genommen ist es egal weil es der compiler sowieso &quot;raus-deklariert&quot;, zumindest machen dies die meisten.

StoreMaster
22.04.2002, 09:24
@all thx, nun leuchtet mir alles ein

@xOOn
strlen war nur ein versuch, um den fehler zu filtern

xOOn
22.04.2002, 10:09
nur der ordnung haber

strlen ermittelt nicht den speicher der reserviert wurde sondern sucht lediglich das erste zeichen mit char \0, also kann es ziemlich wahrscheinlich schon bei strlen crashen weil er auf speicher zugreift der nicht reserviert ist!

also ich verwende
char [256] bzw char * nur noch sehr selten es gibt in der standard template library (STL) eine klasse string die ziemlich aehnlich ist wie ein string in anderen programmiersprachen das gute daran ist dass es ANSI C++ ist!

StoreMaster
22.04.2002, 10:17
nana moment mal. strlen() gibt meines wissens die länge des strings zurück. hat ja auch als rückgabewert ein int...

xOOn
22.04.2002, 10:59
jaein

in c++ ist ein string einfach ein array von zeichen, und damit man weiss wo der string endet wird er mit dem char \0 abgeschlossen, also \0 bedeutet dass dies das letzte zeichen im string ist!

strlen koennte folgendermassen aussehen

int strlen (char *x)
{
for (int i = 0; x[i] == 0; i++);
return i;
}

also wenn x auf einen speicherbereich zeigt, der nicht angelegt wurde, malt er einfach im ram etwas rum und sucht \0, findet er es noch im speciherbereich des progs liefert strlen nur schrott zurueck, findet er aber das \o zeichen nicht, dann wird irgenwann das betriessystem (bei win98 nicht immer :P :P :P ) meckern und den prozess rausschmeisen, weil er in einem speicherbereich liest der ihm nicht gehoert!!

StoreMaster
22.04.2002, 12:57
ja das ist mir jetzt klar, danke. leider kann ich nicht auf die stl klasse string zugreifen, weil ich nur in c programmier (lern es für meine zukünftige firma). hoffe dass die bald auf c++ umsteigen, da ich von der objektorientierten schiene komme.

xOOn
22.04.2002, 13:37
ok dann noch was

char *a = &quot;Hallo&quot;; // funktionert weil dann a auf ne konstante zeigt

char a[256];
char b[256];

a = &quot;Hallo&quot;;
b = a;
b = &quot;Test&quot;;
// dann ist a auch gleich Test!!!

du darfst nie char * zuweisen, weil es pointer sind

strcpy (a, &quot;Hallo&quot;);
strcpy (b, a);
strcpy (b, &quot;Test&quot;);

....

das prob ist dass man es gerne vergisst (zumindest ich)
mit dem scheiss muss man sehr aufpassen

a = &quot;Hallo&quot; + b; da musst du auch strcat machen

STL ist da vieeeelllllll besser

Baegsch
22.04.2002, 19:18
Original von DerWolf

[...]
void lese() {

for(int i = 0; i<COUNT; i++) {

printf(&quot;\nEingabe Nr.%d\n------------\n&quot;, i+1);

printf(&quot;Name : &quot;); scanf(&quot;%s&quot;, eins.name); [i]/* char name[255] =>> name ist ein char*, also muss kein & davor */

printf(&quot;Nachname: &quot;); scanf(&quot;%s&quot;, eins.nachname);

printf(&quot;Alter : &quot;); scanf(&quot;%d&quot;, &eins[i].alter);

}

}



[...]
printf(&quot;Die Laenge betraegt %d&quot;, j);

fprintf(datei, &quot;\nName: %s\n&quot;, eins[k].name);

fprintf(datei, &quot;Nachname: [i]%s\n&quot;, eins[k].nachname);
/* denke mal das war nur schusselfehler ;) */
[...]






int strlen (char *x)
{
for (int i = 0; x[i] == 0; i++);
return i;
}


So läuft das glaub ich mal nicht....
x[i] == 0; <<-- würde ja bedeuten, dass die schleife solang durchlaufen wird wie x[i] gleich NULL ist. Aber das ist ja nciht Sinn. Wir wollen ja die Schleife solang durchlaufen _bis_ x[i] gleich NULL ist.

while(*x++ != &acute;\0&acute;) i++;
return i;


Und zum Thema STL: Ich halte wenig davon, da ich grade diese Freiheit an C liebe.... wenn ich das nicht wöllte, würd ich java programmieren *gg*

DerWolf
22.04.2002, 21:42
Hab nur Code von StoreMaster genommen und soweit umgebaut das es geht, hab net groß auf stil und logik geachtet :D

xOOn
22.04.2002, 21:53
@Baegsch

doch funkt weil in c++
0 == NULL == &acute;\0&acute;

also faule coder (wie zB ich) schreiben 0 anstall NULL

StoreMaster
22.04.2002, 23:10
@Baegsch
also meines erachtens ist java die besser durchdachte sprache wie c/c++, weil auch natürlich neuer. leider ist halt der speed net gerade berauschend

Baegsch
23.04.2002, 15:18
xOOn:

Ne, das emin ich gar nicht. Die for(;;)-Schleife wird doch solnag durchlaufen bis der 2. Paramter FALSE ist. Wenn du jetzt mal das strlen von dir auf einen string loslässt, so wird die Schleife nicht einmal durchlaufen... probier es mal aus ;)

StoreMaster:

*gg* Ansichtssache ;) Ich mag es z.B. nicht, dass java mir den Speicher aufräumt.. sowas mach ich doch gern selbst. Aber ist ja auch nicht Thema hier..

xOOn
23.04.2002, 15:33
@Baegsch

bei der for muss natuerlich != stehen und nicht == (hab da nen fehler reingebaut ;( ;( )

StoreMaster
23.04.2002, 21:12
@Baegsch
gerade die garbagecollection ist einer der grossen vorteile von java... da entstehen wenigstens keine speicherlücken wie bei sonst so vielen programmen.... bestes beispiel für unsachgemässes handhaben des speichers ist wohl winme, das den sogenannten 48h (glaub ich heisst der) bug hat

Baegsch
24.04.2002, 15:44
Das ist ja alles eine Frage der Konzeption. Ich geb Speicher auch frei wenn ich ihn nicht brauch. Ich glaube, das hier ist ein &quot;sinnloser&quot; Glaubenskrieg. Jeder findet seine Sache gut und steht halt dazu. Mein Punkt ist halt nur, dass ich dieses Systemnahe liebe. Ich kümmer mich gern um meinen Speicher und ich schreib auch gern paar Zeilen mehr dafür. Mir geht es in erster Linie nicht um den Komfort der Sprache, welcher bei C auch schon zimelich hoch ist, wie ich finde, sondern um das Verständnis der Internas. My point of view ;)