Programing

C에 철자 배열을 연결하다

c10106 2022. 5. 6. 19:20
반응형

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.58.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>당신이 이미 포함시킬 가능성이 가장 높은 것

asprintf100% 표준은 아니지만 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

반응형