2010-06-14 5 views
2

SHFileOperation에 대한 매개 변수의 파일 이름 목록을 설정하려고합니다. 나는 char 배열에 파일 이름을 연결할 수 있기를 원하지만, 종료 문자를 없애고 싶지 않다. 예를 들어, 내가 이것을 원한다면 :
C : \ ... \ 0E : \ ... \ 0F : \ ... \ 0 \ 0

strcat()을 사용할 때 null을 덮어 씁니다.
C : \ ... E : \ ... 0 \

이 작업을 수행하는 쉬운 방법이 있습니까? 아니면 자신을 위해 새로운 strcat를 코딩해야합니까?Null 문자를 덮어 쓰지 않고 2 개의 C 문자열을 연결하는 방법은 무엇입니까?

+0

이 포함됩니다. 즉, 자신의 구현을 작성하는 것 외에는 표준 C 방법이 없습니다. – jer

답변

1

코드는 매우 간단합니다. 헬퍼 포인터를 사용하여 다음 문자열을 시작할 위치를 추적하십시오. 추적기 포인터를 업데이트하려면 문자열 길이만큼 증가시킵니다. +1 :

const char *data[] = { "a", "b", "c" }; 
size_t data_count = sizeof(data)/sizeof(*data); 
size_t d; 
size_t buffer_size; 
char *buffer; 
char *next; 

// calculate the size of the buffer 
for (d = 0; d < data_count; ++d) 
    buffer_size += (strlen(data[d] + 1); 
buffer_size += 1; 

buffer = malloc(buffer_size); 

// Next will track where we write the next string 
next = buffer; 

for (d = 0; d < data_count; ++d) 
{ 
    strcpy(next, data[d]); 

    // Update next to point to the first character after the terminating NUL 
    next += strlen(data[d]) + 1; 
} 
*next = '\0'; 
1

memcpy를 사용하십시오. 경우 당신이 결과 char 배열의 사전 최대 '길이'를 알고, 조금 더 우아한 될 수있는 GNU stpcpy()를 사용

memcpy(dest, src1, strlen(src1)+1); 
memcpy(&dest[strlen(src1)+1], src2, strlen(src2)+1); 
0

. 필요한 경우

char *src[] = {"C:\\foo", "E:\\bar", "F:\\foobar", 0}; 
char dst[MY_MAX_LEN], *p = dst; 
int i; 

for (i = 0; src[i]; i++) 
    p = stpcpy(p, src) + 1; 
*p = 0; 
assert(p < dst + sizeof dst); 

, stpcpy는()로 정의 할 수 있습니다 :

char *stpcpy(char * restrict dst, const char * restrict src) 
{ 
    return strcpy(dst, src) + strlen(src); 
} 
0

그냥 원래 문자열에 추가 할 strcat와를 사용하지만, 하나를 추가하면 무시하고 너무 오프셋 이전의 문자열의 0 터미네이터.

// an example 

    char testString [256]; 

    strcpy (testString, "Test1"); 

    strcat (testString + strlen(testString)+1, "Test2"); 
    strcat (testString + strlen(testString)+1, "Test3"); 

TestString에 지금은이 일을 당신의 필요에 의문 "Test1을 \ 0Test2 \ 0Test3 \ 0"

관련 문제