PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] 0 terminieren von char.



xmarvel
08-12-2002, 11:52
Wieso muss man das machen und wie sieht sowas aus bzw. wie terminiere ich ein char? So eine richtige Erklärung habe ich noch nicht gefunden.

tkortkamp
08-12-2002, 11:58
Original geschrieben von xmarvel
Wieso muss man das machen und wie sieht sowas aus bzw. wie terminiere ich ein char? So eine richtige Erklärung habe ich noch nicht gefunden.
Damit du und etliche andere Funktionen wissen wann der String vorbei ist damit man nicht über sein Ende schreiben kann(Buffer underrun). Strlen funktioniert z.B. so:


int strlen(char *s)
{
int x=0;
while (*s != '\0')
{
x++;
s++;
}
return x;
}

Solange kein '\0' auftritt (d.h. Ende des Strings) wird x um 1 erhöht

c ya,
Tobias

Edit: ähem... :rolleyes:

anda_skoa
08-12-2002, 12:11
Original geschrieben von tkortkamp Terminieren tust du ein char* mit buf[strlen(buf)-1] = '\0';


Ich weiß, dass du weiß, dass das nicht geht :)
Aber du solltest das nicht von Leuten erwarten, die dazu eine Frage stellen.
Die übernehmen sonst 1-zu-1 diesen Code.

Ciao,
_

xmarvel
09-12-2002, 16:09
Damit du und etliche andere Funktionen wissen wann der String vorbei ist damit man nicht über sein Ende schreiben kann(Buffer underrun)
aha also gehe ich mal davon aus wenn ich ein char deklariere:
char *a;
char [] b;
das dieser automatisch terminiert wird oder nicht ?
Wenn nicht würde den der folgende Code funktionieren um eine 0 terminierung vorzunehmen oder kann man das garnicht so manuell tuen?


char *a;
a = "TEST";

sprintf(a,"%s\0",a);
printf("%s",a);


MFG
xmarvel

micha
09-12-2002, 17:13
Original geschrieben von xmarvel
aha also gehe ich mal davon aus wenn ich ein char deklariere:
char *a;
char [] b;
das dieser automatisch terminiert wird oder nicht ?


Wenn Du den Zeiger/Array gleich bei der Deklarierung initialisierst, dann ja. Ansonsten zeigt a erst mal ins Nirvana und b führt zu einem Komplierfehler, da du das Array nicht initialisiert hast:


char *a = "TEST";
char b[] = "TEST";




Wenn nicht würde den der folgende Code funktionieren um eine 0 terminierung vorzunehmen oder kann man das garnicht so manuell tuen?


Hast Du mal versucht, das Programm zu kompilieren und auszuführen ?
Nein, er würde in dem Fall nicht, da Du über das Ende des Arrays schreibst.
Wenn, dann musst Du einen temporäres char-Array anlegen, das die zusätzlichen Zeichen noch aufnehmen kann, die Du mit sprintf reinschreiben willst:



char *a = "TEST";
char buf[strlen (a) + 1];

sprintf (buf, "%s\0", a);
printf ("%s", buf);


Gruß micha