2012-11-05 9 views
11

Co mam:C tablica char konkatenacji

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

Więc chcę złączyć cmd dodając list od v.

Oczywiście:

strcat(cmd, v[3]); 

nie działa, ponieważ strcat nie akceptuje parametr n = intv[n].

Odpowiedz

9

Problemy z twoim podejściem.

  • C ciągów musi kończyć się 0 bajtów, czyli innymi słowy '\0' charakter. Używanie "" dodaje automatycznie, ale poza tym musisz dodać to sam, a wszystkie funkcje ciągu zależą od tego, że jest tam 0.

  • Twoja v tablica zawiera znaki, a nie łańcuchy, a strcat przyjmuje ciągi.

Jedno rozwiązanie:

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

ta zamienia tablicę char do tablicy wskaźników do ciągów C.

Należy również zadbać o to, aby zawierał wystarczająco dużo miejsca, aby pomieścić wszystko, co do niego dodasz za pomocą polecenia strcat (tutaj to robi). Zwykle najlepiej jest używać snprintf do łączenia ciągów, ponieważ pobiera on całkowity rozmiar docelowej tablicy , w tym, kończąc wartość null, i dodaje, że zawsze tam jest zerowa, więc trudniej jest zepsuć. Przykład z oryginalnej tablicy char:

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]); 

Uwagi: sizeof jak to działa tylko wtedy, gdy buf naprawdę jest tablicą, oświadczył z [] jak tutaj. Również z snprintf, użycie tego samego bufora zarówno jako argumentu docelowego, jak i formatu może dać nieoczekiwane wyniki, więc dodałem nową docelową zmienną bufora.

Jeszcze snprintf przykład ze swoich pierwotnych dwóch tylko tablic, dołączając do końca bieżącej zawartości cmd:

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

więc wyraźnie, w tym konkretnym przypadku, strncat(cmd, &v[3], 1) sugerowane w innych odpowiedzi, aby dodać 1 znak jest o wiele ładniejszy, ale zaletą snprintf jest możliwość dodania wszystkich typów danych obsługiwanych przez printf, a nie znaków.

+1

Dziękujemy! Czy mogę zadbać o to, aby cmd [] zawierało wystarczającą ilość miejsca, która jest według Ciebie NAJSZYBSZY? – redgiun

+0

strncat to prawdopodobnie najszybszy z nich, ale najszybszy to 'int len ​​= strlen (cmd); cmd [len] = v [3]; cmd [len + 1] = 0; '. Zwróć uwagę, że indeksowanie tablicy zaczyna się od 0, więc 'some_cstring [strlen (some_cstring)]' jest zawsze 0. – hyde

+1

dziękuję. to było przydatne – redgiun

1

jak o

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

Spowoduje to dodanie więcej niż jednego znaku, a będzie wyglądać poza końcem tablicy, z której ma zostać skopiowany, ponieważ nie ma zerowego zakończenia. – Benj

+0

masz rację, bardzo ostrożnie – user1203650

2

pierwsze, upewnij się zmienną 'cmd' ma mało pamięci przydzielone.

Po drugie, wzmianka o "v [3]" jest wartością, która jest bajtem z podpisem. Musisz użyć następującego połączenia do strncat (nie strcat):

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

może być na myśli strncat – MOHAMED

12

Hmm. O ile rozumiem, chcesz dodać pojedynczy znak z drugiej tablicy? więc trzeba użyć

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

:-)

+0

Wybrałem inny sposób na zrobienie tego, ale działa to również bardzo prosto. Dziękuję Ci :) – redgiun

1

problemem jest to, że użytkownik nie korzysta strcat także:

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

bo robisz

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

Więc musisz zadeklarować char * jako swój znak.

5

Czy nie użyj:

strcat(cmd,&v[3]); 

&v[3] nie jest wskaźnikiem do NUL łańcuch! zamiast używać

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

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

lub

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

nie można zrobić z

strcat(cmd,&v[3]); 

tego będzie Coppy tablicy V z celi 3 na koniec tablicy i nie kopiować tylko V [3]

Mogę zasugerować inne rozwiązanie

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