3 Stimmen

c Unterschiede in der String-Zuordnung?

Ich habe eine Funktion, die ein char * als einziges Argument nimmt. Ich führe dann einige strtok-Operationen darauf aus. Manchmal funktioniert es und manchmal nicht. Es hängt davon ab, wie die Zeichenkette konstruiert wurde. Hier sind zum Beispiel die beiden Fälle.

int main()
{
   char glob[] = "/abc/def/ghi";
   char *glob2 = "/abc/def/ghi";

   func(glob);  //this one works
   func(glob2); //this one doesnt work

   return 0;
}

Worin besteht der Unterschied zwischen den beiden Zuweisungsmethoden und warum scheitert strtok bei der zweiten Methode?

12voto

aJ. Punkte 33220

strtok() modifiziert grundsätzlich die Eingabezeichenfolge.

char *glob2 = "/abc/def/ghi";

Im obigen Fall ist die glob2 auf schreibgeschützte Daten verweist und daher fehlschlägt, während mit ' char glob[] = "/abc/def/ghi"; ' sind die Daten nicht schreibgeschützt, sondern in einem Char-Array verfügbar. Daher können Änderungen vorgenommen werden.

7voto

sepp2k Punkte 352762

Char[] str1 = "foo" weist ein Array mit den Zeichen auf dem Stack zu (vorausgesetzt, dies geschieht innerhalb einer Funktion). Dieses Array kann ohne Probleme geändert werden.

const char *str = "foo" gibt Ihnen einen Zeiger auf die Zeichenkette foo, die sich normalerweise im Nur-Lese-Speicher befinden wird.

char *str = "foo" tut dasselbe, entfernt aber implizit die Konstante (ohne die Tatsache zu ändern, dass der Zeiger wahrscheinlich auf schreibgeschützten Speicher zeigt).

6voto

kmarsh Punkte 1360

Strtok schreibt in den der Zeichenkette zugewiesenen Speicher.

Auf den meisten Compilern/Laufzeiten/Hardware können Sie nicht in statisch zugewiesenen Stringspeicher schreiben. Sie können in den Stack schreiben.

-1voto

James Youngman Punkte 182

Die anderen Kommentare sind korrekt; Sie sollten stattdessen strtok_r() verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X