strtok
gibt entweder einen Null-Zeiger oder einen Zeiger auf einen NUL-termini Bytefolge (d.h. ein gültiger C string) gefunden werden.
Ihre token = token + '\0';
tut nicht, was Sie (fast sicher) denken. Seit token
ist ein Zeiger (das ist der Rückgabetyp von strtok
) es macht Zeigerarithmetik. Zum Glück '\0'
ist eine langatmige Art zu sagen 0
(Trivia des Augenblicks: Zeichenliterale in C haben Typ int
, nicht Typ char
), so dass es zumindest den Zeiger nicht ändert.
Überprüfen Sie, ob der Wert von strtok
zurückgegeben wird. Wenn Sie die zweite strcpy
schlägt fehl, ist wahrscheinlich, weil strtok
fehlschlägt und einen Nullzeiger zurückgibt.
Das heißt, vorausgesetzt, dass Sie eine einzige feste Zeichenfolge verwenden, um Ihre Begrenzer zu definieren, können Sie wahrscheinlich die Arbeit viel einfacher (und sauberer) mit sscanf
. wenn s
,.-+
enthalten zum Beispiel, könnten Sie verwenden:
sscanf(input, "%1[^,.-+]%*c%9[^,.-+]", update, firstname);
ich den dritten Aufruf strtok
jetzt ignoriert habe, weil Sie nie von seinem Rückgabewert zu einem Ziel zu kopieren (aber das Muster oben zu wiederholen wird natürlich für mehr Variablen arbeiten). Beachten Sie die Verwendung der Nummer zwischen %
und dem Scan-Set ([^...]
). Sie immer möchten die Größe des Puffers angeben, wenn Sie %s
oder% [...] . The size you specify should always be one smaller than the buffer into which you're having them write (because they always append a trailing
'\ 0'') verwenden.
auf gut Glück, dass s
tatsächlich eine Zeichenfolge, die Sie von einer externen Quelle zu lesen ist (auf dieser Reihenfolge oder etwas, so dass Sie nicht leicht seinen Inhalt in einen Stringliteral setzen können) können Sie Ihr Formatstring zur Lauf synthetisieren Zeit, wenn nötig:
char template[] = "%%[^%s]%%*c%%[^%s]";
char format[512];
sprintf(format, template, s, s);
sscanf(input, format, update, firstname);
[Obwohl Formatstrings am häufigsten Literalen sind, ist das nicht erforderlich.]
Edit: ich glaube nicht, dass Sie ursprünglich den Code verknüpft würde, aber es zeigt zumindest ein Problem: char update[1];
. Dies als Ziel von strcpy
zu verwenden ist ein Problem, da es immer einen nachgestellten '\0'
anfügt, um die Zeichenfolge zu beenden. In diesem Fall haben Sie nur ein einzelnes Zeichen zugewiesen, so dass Sie nur Platz für den Terminator und keine tatsächlichen Daten haben. Sie müssen es auf mindestens zwei Zeichen erweitern.Da Sie in Puffer mit fester Größe kopieren, möchten Sie wahrscheinlich vor dem Kopieren prüfen, ob die Zeichenfolge in den Puffer passt, oder aber etwas zum Kopieren verwenden, das die Größe der zu kopierenden Daten begrenzt (und immer noch enthält) ein Terminator, im Gegensatz zu strncpy
).
Was erwarten Sie mit der Anweisung 'token = token + '\ 0';'? Und wie sind 'update' und' firstName' definiert? – lurker
Sie müssen zeigen, was 'update' ist. – John3136
Ohne zu wissen, wie Update und Vorname definiert sind und/oder was sie zeigen, kann diese Frage nicht beantwortet werden. – Pemdas