2016-09-20 2 views
0

어떻게 예를두 개의 문자열을 여러 개의 null 문자로 연결하는 방법은 무엇입니까?

많은 널 (null) 문자가
char s[5]={'s','a','\0','c','h'}; 

char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'}; 

두 문자열을 연결합니다. 나는 strcat()을 시도했다. 작동하지 않습니다. 어떤 방법이 있습니까?

+3

기술적으로 null은 문자열을 끝냅니다. 포인터 연산과'memcpy() '를 사용한다. –

+2

널 종료 문자열은 널 문자 하나만 포함한다. 이것은 분명히 문자열의 마지막 문자이다. –

+0

배열 끝에 "\ 0"이 없습니다 : 예 :'{ 's', 'a', '\ 0', 'c', 'h'}; s ','a ','\ 0 ','c ','h ','\ 0 '}; 그것 없이는 마지막 문자열이 끝나는 곳을 결정할 수 없습니다. 사실 두 개의''\ 0 ''이 필요하기 때문에 더 많은 문자열이 있음을 알 수 있습니다. –

답변

4

정의상 C- 문자열은 null로 끝나기 때문에 까다 롭습니다. 그래서 실제로 가지고있는 것은 2 개의 문자열이 아니라 함께 쓰려는 2 개의 바이트 버퍼입니다. (이유는 여기에 strcat 같은 기능이 여기에서 작동하지 않는 이유입니다 - 그들은 인수가 C- 문자열이라고 기대합니다.)

버퍼가 어디서 끝나는지를 알려주기 위해 널 문자를 사용할 수 없으므로 당신은 C-strings로 할 수 있습니다, 당신은 미리 버퍼의 크기를 알아야합니다.

char dest[16]; 
memcpy(dest,  s, 5); // Copy s to the final buffer 
memcpy(dest + 5, m, 11); // Copy m to the final buffer just after s 
+0

구현을 제공하기 위해 Upvoted. 덕분에 – Bathsheba

+0

. 두 번째 사본에 실제로 – Abu

0

모든 C 표준 라이브러리 문자열 함수는 첫 번째 \0에서 중지됩니다. 그건 의도적으로입니다. 실제로 입력 배열 \0으로 끝나지 않으므로은 잘 작동하지 않습니다.

그래서 가장 쉬운 방법은 memcpy을 대신 사용하고 자신을 복사 할 문자 수를 지정하는 것입니다. 필요한만큼의 메모리를 대상 버퍼에 할당하는 것을 잊지 마십시오.

+1

첫 번째 NUL 바이트에서 멈추지 않으면 문자열 기능이 없습니다. 이것은 디자인의 문제가 아니지만 C로 된 문자열의 관례/정의입니다. – Olaf

0

더 간단한 방법 : 그럼 비트 블리트 하나의 버퍼에 두를만큼 간단 이상적으로

const int size_s = 5; 
const int size_m = 11; 
char s[size_s]={'s','a','\0','c','h'}; 
char m[size_m]={'b','e','\0','c','h','b','\0','e','\0','c','h'}; 
char destination[size_s+size_m]; 
int i; 
for (i = 0;i < size_s;i++) 
    destination[i] = s[i]; 

for (i = 0;i < size_m;i++) 
    destination[i+size_s] = m[i]; 

, 당신은 사용해야 방어 적이기

const int size_s = 5; 
const int size_m = 11; 
char s[size_s]={'s','a','\0','c','h'}; 
char m[size_m]={'b','e','\0','c','h','b','\0','e','\0','c','h'}; 
char destination[size_s+size_m]; 

memcpy(destination,s,size_s); 
memcpy(destination,m,size_m); 
+1

대상 + 크기 _을 적용 했습니까? – Bathsheba

0
char s[5]={'s','a','\0','c','h'}; 
char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'}; 
char* e = (char*)malloc(sizeof(s) + sizeof(m)); 

memcpy(e, s, sizeof(s)); 
memcpy(&e[sizeof(s)], m, sizeof(m)); 

완료되면 결과 문자열을 삭제하는 것을 잊지 마십시오.

free(e); 
+0

제 답변보다 조금 깔끔하지만 배열의 sizeof는 포인터의 sizeof와는 다르다는 점에 유의하십시오 (그리고 종종 버퍼를 처리 할 때 실제 배열을 가지지 않고 첫 번째 요소에 대한 포인터 만 사용합니다). – Cameron

+1

'새 문자'....'delete [] e;'C? 방법? –

+0

저는 가능한 한 적은 코드로 작성하려고했습니다. 나는 그가 왜이 일을 시작하기를 원하는지 이해하지 못한다. 그리고 그가 좋은 이유가있다하더라도 나는 이것보다 훨씬 더 안전 할 것이다. – Sam

관련 문제