SHFileOperation에 대한 매개 변수의 파일 이름 목록을 설정하려고합니다. 나는 char 배열에 파일 이름을 연결할 수 있기를 원하지만, 종료 문자를 없애고 싶지 않다. 예를 들어, 내가 이것을 원한다면 :
C : \ ... \ 0E : \ ... \ 0F : \ ... \ 0 \ 0
strcat()을 사용할 때 null을 덮어 씁니다.
C : \ ... E : \ ... 0 \
이 작업을 수행하는 쉬운 방법이 있습니까? 아니면 자신을 위해 새로운 strcat를 코딩해야합니까?Null 문자를 덮어 쓰지 않고 2 개의 C 문자열을 연결하는 방법은 무엇입니까?
2
A
답변
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"
관련 문제
- 1. 덮어 쓰지 않고 텍스트 파일에 쓰기 C#
- 2. iPhone에서 두 개의 문자열을 연결하는 방법은 무엇입니까?
- 3. 덮어 쓰지 않고 텍스트 파일을 저장하는 방법은 무엇입니까?
- 4. 2 개의 웹캠을 PC에 연결하는 방법은 무엇입니까?
- 5. 파일을 덮어 쓰지 않고 바이트를 쓰는 방법
- 6. C#에서 string.insert가 덮어 쓰지 않습니까?
- 7. CSS : 덮어 쓰지 않고 "정상"으로 재설정
- 8. config를 덮어 쓰지 않고 Clickonce 업데이트
- 9. INSERT 쿼리에서 NULL 값을 가진 열을 덮어 쓰지 않아도됩니까?
- 10. 그것을 덮어 쓰지 않고 바이너리 파일을 업데이트 -> C
- 11. C# 마지막 문자열을 덮어 쓰지 않고 하나의 .txt 파일에 "X"시간 저장.
- 12. null 문자열을 만드는 방법은 무엇입니까?
- 13. 기존 파일을 덮어 쓰지 않고 PHP로 파일을 어떻게 복사합니까?
- 14. 문자열을 변수와 연결하는 방법은 무엇입니까?
- 15. Java로 덮어 쓰지 않고 텍스트 파일에 어떻게 추가합니까?
- 16. PHP를 사용하여 문자열을 2 개의 변수로 분리하는 방법은 무엇입니까?
- 17. 대상 데이터베이스를 덮어 쓰지 않고 Drupal 웹 사이트 복제
- 18. Java 분리 문자를 기준으로 문자열을 2 개의 문자열로 분할합니다.
- 19. JavaScript : 기존 페이지를 덮어 쓰지 않고 onClick 핸들러 추가하기
- 20. 2 개의 자바 스크립트 객체를 연결하는 올바른 방법은 무엇입니까?
- 21. 덮어 쓰지 않고 열의 텍스트를 기존 열에 추가
- 22. Objective-C (iPhone)에서 문자열을 연결하는 방법은 무엇입니까?
- 23. 2 개의 활동에서 하나의 활동으로 문자열을 전달하는 방법은 무엇입니까?
- 24. 2 개의 레이아웃 자바 안드로이드를 연결하는 방법?
- 25. Tcl에서 문자열을 간결하게 연결하는 방법은 무엇입니까?
- 26. C++ : 콘솔을 출력하고 화면을 지우지 않고 모든 것을 다시 쓰지 않고 텍스트를 덮어 쓰려면 어떻게해야합니까?
- 27. 웹 양식에 null 문자를 입력하는 방법은 무엇입니까?
- 28. 덮어 쓰지 않고 {% block %}에 추가 할 수 있습니까?
- 29. 기존 파일을 덮어 쓰지 않고 파이썬으로 파일을 만드는 방법
- 30. 클래스가 addClass로 덮어 쓰지 않습니다.
이 포함됩니다. 즉, 자신의 구현을 작성하는 것 외에는 표준 C 방법이 없습니다. – jer