2012-11-05 21 views
11

Was ich habe:C char-Array Verkettung

char cmd[50] = "some text here"; 
char v[] = {'a','s','d','c','b'}; 

Deshalb möchte ich cmd verketten durch einen Brief von v hinzufügen.

Offensichtlich:

strcat(cmd, v[3]); 

funktioniert nicht, weil strcat nicht die n = intv[n] Parameter akzeptieren.

Antwort

9

Probleme mit Ihrem Ansatz.

  • C-Strings müssen '\0' Zeichen in 0 Byte, mit anderen Worten beenden. Die Verwendung von "" fügt das automatisch hinzu, aber ansonsten müssen Sie es selbst hinzufügen, und alle Zeichenfolgenfunktionen hängen davon ab, dass 0 da ist.

  • Ihr v-Array enthält Zeichen, keine Zeichenfolgen und strcat nimmt Zeichenfolgen.

Eine Lösung:

char cmd[50] = "some text here"; 
char *v[] = {"a","s","d","c","b"}; 
strcat(cmd,v[3]); 

Dadurch wird Ihr Char-Array in ein Array von Zeigern auf C-Strings.

Es liegt auch in Ihrer Verantwortung, darauf zu achten, dass cmd[] genügend Platz für alles enthält, was Sie mit strcat hinzufügen (hier ist es). Es ist normalerweise am besten, snprintf zu verwenden, um Zeichenkettenverkettung zu tun, da es die Gesamtgröße des Zielarrays einschließlich, das null beendet, annimmt, und Null dort immer hinzufügt, also ist es schwieriger, durcheinander zu bringen. Beispiel mit Ihrem ursprünglichen char-Array:

char cmd[50] = "some text here"; 
char buf[50]; 
char v[] = {'a','s','d','c','b'}; 
snprintf(buf, sizeof buf, "%s%c", cmd, v[3]); 

Hinweise: sizeof wie dies funktioniert nur, wenn buf wirklich ein Array ist, erklärt mit [] wie hier. Auch bei Verwendung von snprintf kann die Verwendung des gleichen Puffers sowohl als Ziel als auch als Format-Argument zu unerwarteten Ergebnissen führen. Daher habe ich eine neue Zielpuffervariable hinzugefügt.

Ein weitere snprintf Beispiel mit Ihren ursprünglichen zwei Arrays nur, Anfügen von aktuellem Inhalt von cmd zu beenden:

snprintf(cmd + strlen(cmd), (sizeof cmd) - strlen(cmd), "%c", v[3]); 

So klar, in diesem speziellen Fall schlugen die strncat(cmd, &v[3], 1) in anderen Antworten 1 Zeichen hinzufügen ist viel schöner, aber der Vorteil von snprintf ist, dass Sie alle von printf unterstützten Datentypen hinzufügen können, nicht chars.

+1

Danke! Wenn ich dafür sorgen kann, dass cmd [] genügend Platz enthält, welche ist die SCHNELLSTE Methode? – redgiun

+0

strncat ist wahrscheinlich der schnellste von diesen, aber am schnellsten ist 'int len ​​= strlen (cmd); cmd [len] = v [3]; cmd [len + 1] = 0; '. Beachten Sie, wie die Array-Indizierung bei 0 beginnt, also ist 'some_cstring [strlen (some_cstring)]' immer 0. – hyde

+1

danke. das war nützlich – redgiun

1

wie etwa

strcat(cmd,&v[3]); 
+1

Dies wird mehr als ein Zeichen, hinzufügen und es wird über das Ende des Arrays sucht kopiert werden, da es keine Null-Terminierung. – Benj

+0

du hast recht, sehr vorsichtig – user1203650

2

Erstens, stellen Sie sicher, dass die Variable 'cmd' genügend Speicher zugewiesen hat.

Zweitens ist die Erwähnung von 'v [3]' der Wert, der ein vorzeichenbehaftetes Byte ist. Sie müssen den folgenden Aufruf von strncat verwenden (nicht strcat):

strncat(cmd,&v[3],1); 
+2

vielleicht meinst du strncat – MOHAMED

12

Hmm. Soweit ich verstehe, möchten Sie ein einzelnes Zeichen vom zweiten Array hinzufügen? so müssen Sie

strncat (cmd, &v[3], 1); 

:-)

+0

Ich wählte einen anderen Weg, es zu tun, aber das funktioniert auch und es ist sehr einfach. Vielen Dank :) – redgiun

1

das Problem verwenden ist, dass Sie nicht strcat auch verwenden Sie:

char *strcat (char *dest, const char *src); 

, weil Sie tun

char *strcat (char *dest, char src); 

Du musst also Char * als Char angeben.

5

Sie nicht Verwendung dieses:

strcat(cmd,&v[3]); 

&v[3] ist kein Zeiger auf einen nullterminierten String! stattdessen

strncat(cmd, &v[3], 1); 
1
char buf[2]; 

sprintf(buf,"%c", V[3]); 
strcat(cmd, buf); 

oder

strncat (cmd, &v[3],1); 

Sie können es nicht mit

strcat(cmd,&v[3]); 

Dies wird die V-Array von Zelle 3 bis zum Ende des Arrays coppy und nicht kopieren nur V [3]

Ich kann eine andere Lösung vorschlagen

int len = strlen(cmd); 
cmd[len]=v[3]; 
cmd[len+1] = '\0';