2012-11-05 2 views
11

내가 무엇을 가지고 : C char 배열 연결

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

그래서 내가 v에서 편지 쓰기를 추가하여 cmd을 연결하고 싶다. 분명히

: strcatv[n] 매개 변수 n = int을 허용하지 않기 때문에

strcat(cmd, v[3]); 

이 작동하지 않습니다. 대한

strcat(cmd,&v[3]); 

답변

9

문제점.

  • C 문자열 즉 0 바이트 '\0' 문자를 종료한다. ""을 사용하면 자동으로 추가되지만 그렇지 않으면 직접 추가해야하며 모든 문자열 함수는 0이 해당됩니다.

  • v 배열에 문자열이 아닌 문자가 포함되어 있고 strcat은 문자열을 사용합니다.

하나의 솔루션 :

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

이 C 문자열에 대한 포인터의 배열에 당신의 문자 배열을집니다.

또한, cmd[]에 strcat (여기에있는 내용)을 추가하는 데 필요한 공간을 충분히 확보해야합니다. 일반적으로 snprintf을 사용하여 문자열 연결을 수행하는 것이 가장 좋습니다. 대상 배열 의 전체 크기는 null을 종료하는을 포함하며 항상 null이 추가되므로 엉망이되는 것은 어렵습니다. 원래의 문자 배열을 가진 예 :

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

참고 : buf 정말 여기에 같은 [] 선언 배열이있는 경우에만이 작품 같은 SIZEOF. 또한 snprintf를 사용하면 대상 및 형식 인수로 동일한 버퍼를 사용하면 예기치 않은 결과가 발생할 수 있으므로 새로운 대상 버퍼 변수를 추가했습니다. cmd를의 현재 내용의 끝 추가 만 원래 두 배열과

한 예로 현재 snprintf 더,이 특별한 경우에, 그래서 명확하게

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

strncat(cmd, &v[3], 1) 1 개 문자를 추가 할 다른 답변에서 제안 훨씬 더 좋지만 snprintf의 이점은 문자가 아닌 printf가 지원하는 모든 데이터 유형을 추가 할 수 있다는 것입니다.

+1

고맙습니다! cmd []에 여유 공간이 충분히 포함되어 있다고 생각하면 가장 빠른 방법이라고 생각합니까? – redgiun

+0

아마도 strncat이 가장 빠르지 만 가장 빠른 것은'int len ​​= strlen (cmd); cmd [len] = v [3]; cmd [len + 1] = 0;'. 배열 인덱싱이 0에서 시작하는 방법에 유의하십시오. 따라서 some_cstring [strlen (some_cstring)]은 항상 0입니다. – hyde

+1

감사합니다. 유용했습니다 – redgiun

1

.

둘째, 'v [3]'에 대한 언급은 부호있는 바이트 값입니다. strncat (strcat가 아님)에 다음 호출을 사용해야합니다.

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

이것은 하나 이상의 char을 추가 할 것이고 널 종료가 없기 때문에 복사 할 어레이의 끝 부분을 보게 될 것입니다. – Benj

+0

당신 말이 맞아요, 매우 조심 해요 – user1203650

2

첫째, 반드시 변수를 만드는 'cmd'를이 충분한 메모리가 할당 한 방법

+2

당신은 strncat – MOHAMED

12

흠. 늘어나는만큼 내가 두 번째 배열에서 단일 문자를 추가하려면 이해합니까? 은 그래서 당신은 사용할 필요가

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

:-) 문제가 당신은뿐만 아니라 strcat와 사용하지 않는 것이

+0

다른 방법으로 선택했지만 광고도 매우 간단합니다. 고맙습니다 :) – redgiun

1

:

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

당신이 때문에

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

따라서 char *를 char로 선언해야합니다. 널 포인터는 문자열을 종료하지

strcat(cmd,&v[3]); 

&v[3]은 다음과 같습니다

5

하지 사용이 작업을 수행합니다! 대신 사용

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

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

또는

strncat (cmd, &v[3],1); 
를 복사 배열의 마지막에 셀 3의 V 배열을 coppy하지 않습니다

strcat(cmd,&v[3]); 

이 함께 할 수 없습니다

단지 V [3]

나는 또 다른 해답을 제안 할 수있다