C에 철자 배열을 연결하다
차르 배열이 있다.
char* name = "hello";
그 이름에 확장자를 추가하여 이름을 만들고 싶다.
hello.txt
어떻게 이럴 수가 있지?
name += ".txt"
효과가 없다
스트래트 기능을 살펴보십시오.
특히 다음을 시도해 보십시오.
const char* name = "hello";
const char* extension = ".txt";
char* name_with_extension;
name_with_extension = malloc(strlen(name)+1+4); /* make space for the new string (should check the return value ...) */
strcpy(name_with_extension, name); /* copy name into the new var */
strcat(name_with_extension, extension); /* add the extension */
...
free(name_with_extension);
차르 배열이 있다.
char* name = "hello";
아니, 문자열 리터럴에 대한 문자 포인터가 있어.많은 사용법에서는 이름이 가리키는 것에 더 관심이 있는지 또는 문자열 값인 "Hello"에 따라 const 수식어를 추가할 수 있다.문자("안녕")를 수정하려고 해서는 안 된다. 왜냐하면 나쁜 일은 일어날 수 있기 때문이다.
주요 전달 사항은 C가 제대로 된(또는 일급) 끈 타입이 없다는 것이다."스트링"은 일반적으로 문자열의 끝을 나타내는 종료 null('\0' 또는 10진수 0) 문자의 문자 배열 또는 문자 배열의 포인터를 의미한다.
나는 The C Programming Language의 섹션 1.9 (제28페이지 2판)를 읽어볼 것을 제안한다.나는 C를 배우기 위해 이 작은 책(<300쪽)을 읽기를 강력히 추천한다.
질문 외에도 섹션 6 - 배열 및 포인터 및 섹션 8 - C FAQ의 문자와 문자열이 도움이 될 수 있다.질문 6.5와 8.4는 시작하기에 좋은 장소일 수 있다.
나는 그것이 왜 당신의 발췌문이 효과가 없는지 이해하는데 도움이 되기를 바란다.다른 사람들은 그것을 작동시키기 위해 어떤 변화가 필요한지 간략히 설명했다.기본적으로 전체 문자열을 종료(종료) '\0' 문자로 저장할 수 있을 만큼 큰 문자 배열(문자 배열)이 필요하다.그런 다음 표준 C 라이브러리 함수를 사용하여 "Hello"를 복사한 다음 표준 C 라이브러리 strcat(또는 더 낫지만 더 나은 strncat) 함수를 사용하여 연결하십시오.string.h 헤더 파일을 포함하여 함수 선언을 선언하십시오.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
char filename[128];
char* name = "hello";
char* extension = ".txt";
if (sizeof(filename) < strlen(name) + 1 ) { /* +1 is for null character */
fprintf(stderr, "Name '%s' is too long\n", name);
return EXIT_FAILURE;
}
strncpy(filename, name, sizeof(filename));
if (sizeof(filename) < (strlen(filename) + strlen(extension) + 1) ) {
fprintf(stderr, "Final size of filename is too long!\n");
return EXIT_FAILURE;
}
strncat(filename, extension, (sizeof(filename) - strlen(filename)) );
printf("Filename is %s\n", filename);
return EXIT_SUCCESS;
}
먼저 strcpy를 사용하여 현재 문자열을 더 큰 배열로 복사한 다음 strcat을 사용하십시오.
예를 들어 다음과 같이 할 수 있다.
char* str = "Hello";
char dest[12];
strcpy( dest, str );
strcat( dest, ".txt" );
드물게 사용할 수 없는 경우strncat
,strcat
또는strcpy
. 그리고 당신은 에 접근할 수 없다.<string.h>
사용할 수 없도록strlen
또한, 당신은 아마 차 배열의 크기조차 알지 못할지도 모른다. 그리고 당신은 단지 포인터만을 가지고 있기 때문에 여전히 연결하기를 원한다.옛날 학교 말록도 할 수 있고 캐릭터도 셀 수 있어
char *combineStrings(char* inputA, char* inputB) {
size_t len = 0, lenB = 0;
while(inputA[len] != '\0') len++;
while(inputB[lenB] != '\0') lenB++;
char* output = malloc(len+lenB);
sprintf((char*)output,"%s%s",inputA,inputB);
return output;
}
그것은 단지 필요하다.#include <stdio.h>
당신이 이미 포함시킬 가능성이 가장 높은 것
asprintf
100% 표준은 아니지만 GNU 및 BSD 표준 C 라이브러리를 통해 사용할 수 있으므로, 아마 가지고 계실 겁니다.출력을 할당하기 때문에 굳이 앉아서 문자를 세지 않아도 된다.
char *hi="Hello";
char *ext = ".txt";
char *cat;
asprintf(&cat, "%s%s", hi, ext);
sprintf() 함수를 사용하여 문자열을 연결할 수 있다.예를 들어, 다음과 같은 경우:
char file[80];
sprintf(file,"%s%s",name,extension);
그리고 당신은 "파일"에 연결된 문자열을 갖게 될 것이다.
여기에 답을 복사해서 붙여넣거나 아니면 호스트 조엘이 스트래트에 대해 뭐라고 하는지 읽어봐
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *name = "hello";
int main(void) {
char *ext = ".txt";
int len = strlen(name) + strlen(ext) + 1;
char *n2 = malloc(len);
char *n2a = malloc(len);
if (n2 == NULL || n2a == NULL)
abort();
strlcpy(n2, name, len);
strlcat(n2, ext, len);
printf("%s\n", n2);
/* or for conforming C99 ... */
strncpy(n2a, name, len);
strncat(n2a, ext, len - strlen(n2a));
printf("%s\n", n2a);
return 0; // this exits, otherwise free n2 && n2a
}
참조URL: https://stackoverflow.com/questions/2218290/concatenate-char-array-in-c
'Programing' 카테고리의 다른 글
Vuex 데이터를 사후 대응적으로 만들기 (0) | 2022.05.06 |
---|---|
모키토 던져진 예외를 어떻게 조롱하고 주장할 것인가? (0) | 2022.05.06 |
VueJS와 케이크를 통합하는 모범 사례PHP 3 (0) | 2022.05.06 |
Vuejs 라우터, JavaScript 코드의 조건부 로딩 (0) | 2022.05.05 |
store/의 Vuex Classic 모드는 사용되지 않으며 Nuxt 3에서 제거됨 (0) | 2022.05.05 |