PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : problem mit ausgabe(in c)



avuton
09-01-2003, 09:16
Hallo kann mir jemand sagen, warum da folgende Programm nur Hans Peter 0 und nicht Hans Peter 16 ausgibt?



#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
struct daten{
char mvorname[255];
char mnachname[255];
int malter;
};
int zeile_analyse(char *zeile, char *feld, char trenn){
int i=0;

while(zeile[i]!=trenn){
i++;
if(i>255){
i=0;
break;
}
}
if(i==0){
feld=zeile;
zeile="";
}
else{
memcpy(feld, zeile, i);
memcpy(zeile, zeile +i +1, 255 -i);
feld[i]='\0';
}
if(strlen(zeile)==0)
return 0;
else
return 1;
}

int schreibe(char *zeile, char *record){
struct daten angab[2];

int j;
int i=0;
char feld[255];
char trenn=';';
while(strlen(zeile)!=0){
j=zeile_analyse(zeile, feld, trenn);
//printf("\n%s\t%s",feld,zeile);
i++;
if(j==0)
break;
//sprintf(angab, record);
//angab=record;
switch(i){
case 1:
strcpy(angab[0].mvorname, feld);
break;
case 2:
strcpy(angab[0].mnachname, feld);
break;
case 3:
angab[0].malter=feld;
break;
}

}

printf("%s %s %d", angab[0].mvorname, angab[0].mnachname, angab[0].malter);

return 0;
}

main(){
char record[255];
char zeile[255];

sprintf(zeile, "hans;peter;16");
schreibe(zeile, record);
return 0;
}


danke

brotzi
09-01-2003, 12:12
angab[0].malter=feld; <-- hier ist der fehler?
muss heißen:
angab[0].malter = atoi(feld);

avuton
09-01-2003, 12:25
kappt mit atoi() trotzdem nicht, kannst ja mal compilen.
Das Programm hört vor dem dritten case auf, weil j zu früh null wird, kann mir jemand sagen, warum?

Jasper
09-01-2003, 13:37
Original geschrieben von avuton
kappt mit atoi() trotzdem nicht, kannst ja mal compilen.
Das Programm hört vor dem dritten case auf, weil j zu früh null wird, kann mir jemand sagen, warum?

wegen:
while(zeile[i]!=trenn){
i++;
if(i>255){
i=0;
break;
}
}

in funktion 'zeile_analyse'. nach der '16' kommt kein trennzeichen mehr.
du könntest auch strtok oder sscanf verwenden anstatt selbst zu parsen.

-j

avuton
10-01-2003, 06:57
Ne das klappt auch nicht, wenn nacher der 16 noch ein Trennzeichen kommt.
Bedanke mich für jede HIlfe.
Das Problem ist denke ich, dass j zu früh null wird, wenn ich nach 16 noch;lala schreibe funktioniert es wieder, dass bis zur sechszehn ausgegeben wird und lala nciht mehr, j wird wird immer um eins zu früh null.
warum?

Jasper
10-01-2003, 08:09
Original geschrieben von avuton
warum?

na, ist der code von dir oder mir? :)

if(i==0){
feld=zeile;
zeile="";
}
if(strlen(zeile)==0)
return 0;
else
return 1;
}

wenn kein trennzeichen mehr kommt, wird i==0 (hatten wir bereits festgestellt),
wenn i==0 -> zeile="" -> strlen(zeile)==0 -> return 0

wenn zwar trennzeichen kommt, aber kein zeichen mehr dahinter -> strlen(zeile)==0 -> return 0

-j

avuton
10-01-2003, 08:24
Jetzt habe ich es hinbekommen, falss es jemand interessiert, wi so was aussieht, es fun´ktioniert so:



#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>

struct namen{
char mvorname[255];
char mnachname[255];
int malter;
};
struct namen angab[2];
int zeile_analyse(char *zeile, char *feld, char trenn){
int i=0;
while(zeile[i]!=trenn){
i++;
if(zeile[i]=='\0')
break;
if(i>255){
i=0;
break;
}
}
if(i==0){
feld=zeile;
zeile="";
}
else{
memcpy(feld, zeile, i);
memcpy(zeile, zeile +i +1, 255 -i);
feld[i]='\0';
}
if(strlen(zeile)==0)
return 0;
else
return 1;
}
int schreibe(char *zeile, char *record){

int j=-1;
int i=0;
char feld[255];
char trenn=';';
while(strlen(zeile)!=0){
j=zeile_analyse(zeile, feld, trenn);
i++;
if(j==0)
break;
switch(i){
case 1:
strcpy(angab[0].mvorname, feld);
break;
case 2:
strcpy(angab[0].mnachname, feld);
break;
case 3:
angab[0].malter=atoi(feld);
break;

}

}

printf("\n%s %s %d", angab[0].mvorname, angab[0].mnachname, angab[0].malter);

return 0;
}
int main(void){
char record[255];
char zeile[255];

sprintf(zeile, "hans;peter;16");
schreibe(zeile, record);
return 0;
}



EDIT : habt ihr eigentlich noch nie was von Code-tags gehört?? :confused:

Noch mal danke an alle,die mir geholfen haben.
Avuton

sauertopf
07-02-2003, 17:48
Hm - Der Code ist wirklich sehr unleserlich, wenn er ohne Code-Tags (#-Button) geschrieben wird. Keine Einrückungen und proportionale Schrift ...
Vielleicht hätte ich ihn auch gelesen; aber so ...