programing

C의 문자열에 문자 추가?

bestcode 2022. 8. 31. 22:43
반응형

C의 문자열에 문자 추가?

C 문자열에 단일 문자를 추가하려면 어떻게 해야 하나요?

char* str = "blablabla";
char c = 'H';
str_append(str,c); /* blablablaH */

C 문자열에 문자를 추가하려면 먼저 문자열을 포함하는 메모리버퍼가 추가 문자를 수용할 수 있을 정도로 충분한지 확인해야 합니다.예제 프로그램에서는 지정된 리터럴 문자열을 수정할 수 없으므로 추가 메모리 블록을 새로 할당해야 합니다.

다음은 샘플입니다.

#include <stdlib.h>

int main()
{
    char *str = "blablabla";
    char c = 'H';

    size_t len = strlen(str);
   
    /* one for extra char, one for trailing zero */
    char *str2 = malloc(len + 1 + 1);

    strcpy(str2, str);
    str2[len] = c;
    str2[len + 1] = '\0';

    printf("%s\n", str2); /* prints "blablablaH" */

    free(str2);
}

먼저 입력 문자열의 모든 문자, 추가할 추가 문자 및 마지막 0 문자를 수용할 수 있을 만큼 충분한 크기의 새 메모리 청크를 할당하는 데 사용합니다.그런 다음 를 호출하여 입력 문자열을 새 버퍼에 복사합니다.마지막으로, 새로운 버퍼의 마지막 2바이트를 변경하여 추가할 문자 및 후행 0에 태킹합니다.

char* str = "blablabla";     

이 문자열은 전혀 변경하지 마십시오.구현 정의 읽기 전용 영역에 있습니다.수정하면 정의되지 않은 동작이 발생합니다.

문자열 리터럴이 아닌 문자 배열이 필요합니다.

올바른 읽기:
char a [ ] = "string"과 char *p = "string"의 차이점은 무엇입니까?

원본 포스터에는 다음과 같은 내용이 기재되어 있지 않습니다.

  char* str = "blablabla";

그렇지만

  char str[128] = "blablabla";

스트랫을 사용하여 문자열 전체를 추가하는 것보다 단일 문자를 추가하는 것이 더 효율적일 수 있습니다.어려운 방법으로 다음과 같이 할 수 있습니다.

  char tmpstr[2];
  tmpstr[0] = c;
  tmpstr[1] = 0;
  strcat (str, tmpstr);

하지만 당신은 또한 쉽게 당신 자신의 함수를 쓸 수 있습니다(나 이전에 여러 명이 했던 것처럼).

  void strcat_c (char *str, char c)
  {
    for (;*str;str++); // note the terminating semicolon here. 
    *str++ = c; 
    *str++ = 0;
  }

를 사용할 수 있습니다.strcatstring.h표준 헤더를 통과하지 마십시오.char두 번째 인수로 대신 다음 코드를 사용합니다.

void append_str(char str[] , char c){
     auto char arr[2] = {c , '\0'};
     strcat(str , arr);
}

Linux가 문제라면 다음 두 가지 문자열을 추가하는 가장 쉬운 방법입니다.

char * append(char * string1, char * string2)
{
    char * result = NULL;
    asprintf(&result, "%s%s", string1, string2);
    return result;
}

MS Visual C에서는 동작하지 않습니다.

주의: 에 의해 반환된 메모리에 저장해야 합니다.

C에는 문자열 자체가 없습니다.문자 "blabla\0"을 포함하는 읽기 전용 메모리를 가리키는 문자 포인터입니다.여기에 문자를 추가하려면 a) 쓰기 가능한 메모리와 b) 새 형식의 문자열을 위한 충분한 공간이 필요합니다.문자열 리터럴 "blabla\0"에는 둘 다 없습니다.

솔루션은 다음과 같습니다.

1) 사용malloc()메모리를 동적으로 할당하는 것을 잊지 마세요.free()나중에)를 참조해 주세요.
2) char 어레이를 사용합니다.

문자열 사용 시 다음 명령을 사용하는 것을 고려해 주십시오.strn*의 변종str*함수 -- 메모리 범위 내에 머무르도록 도와줍니다.

새 문자열 만들기(string + char)

#include <stdio.h>    
#include <stdlib.h>

#define ERR_MESSAGE__NO_MEM "Not enough memory!"
#define allocator(element, type) _allocator(element, sizeof(type))

/** Allocator function (safe alloc) */
void *_allocator(size_t element, size_t typeSize)
{
    void *ptr = NULL;
    /* check alloc */
    if( (ptr = calloc(element, typeSize)) == NULL)
    {printf(ERR_MESSAGE__NO_MEM); exit(1);}
    /* return pointer */
    return ptr;
}

/** Append function (safe mode) */
char *append(const char *input, const char c)
{
    char *newString, *ptr;

    /* alloc */
    newString = allocator((strlen(input) + 2), char);
    /* Copy old string in new (with pointer) */
    ptr = newString;
    for(; *input; input++) {*ptr = *input; ptr++;}
    /* Copy char at end */
    *ptr = c;
    /* return new string (for dealloc use free().) */
    return newString;
}

/** Program main */
int main (int argc, const char *argv[])
{
    char *input = "Ciao Mondo"; // i am italian :), this is "Hello World"
    char c = '!';
    char *newString;

    newString = append(input, c);
    printf("%s\n",newString);
    /* dealloc */
    free(newString);
    newString = NULL;

    exit(0);
}

              0   1   2   3    4    5   6   7   8   9  10   11
newString is [C] [i] [a] [o] [\32] [M] [o] [n] [d] [o] [!] [\0]

하지 말아 주세요( 「 」 「 」 「 」 )[len +1]등)의 정확한 크기를 모르면 다른 데이터가 손상될 수 있습니다. alloc를 대신배열의 이 문자 배열로 지정되어야 문자 배열은 마지막 값이 문자 배열로 지정되어야 합니다.\0calloc()는, 을 「이러다」로 합니다.\0이것은, 에 매우 적합합니다.char★★★★★★★★★★★★★★★★★★.

이게 도움이 됐으면 좋겠어요.

여기 있습니다. 100% 동작합니다.

char* appending(char *cArr, const char c)

{

int len = strlen(cArr);

cArr[len + 1] = cArr[len];

cArr[len] = c;

return cArr;


}

제 경우, 이것이 제가 찾은 최고의 해결책이었습니다.

snprintf(str, sizeof str, "%s%c", str, c);

c에서는 그런 문자열을 선언할 수 없다고 생각합니다.const char*에 대해서만 할 수 있으며 const char*는 const이기 때문에 변경할 수 없습니다.

동적 문자 배열을 사용할 수 있지만 재할당을 처리해야 합니다.

편집: 실제로 이 구문은 올바르게 컴파일됩니다.스트링이 초기화되어 있는 경우(문자열 리터럴에서) 스트링이 가리키는 것을 변경할 수 없습니다.

strncat()을 사용할 수 있습니다.

#include <stdio.h>
#include <string.h>

int main(void){
  char hi[6];
  char ch = '!';
  strcpy(hi, "hello");

  strncat(hi, &ch, 1);
  printf("%s\n", hi);
}

언급URL : https://stackoverflow.com/questions/10279718/append-char-to-string-in-c

반응형