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;
}
를 사용할 수 있습니다.strcat
에string.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
를 대신배열의 이 문자 배열로 지정되어야 문자 배열은 마지막 값이 문자 배열로 지정되어야 합니다.\0
calloc()
는, 을 「이러다」로 합니다.\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
'programing' 카테고리의 다른 글
Vue.js - 부모 <-> 슬롯 통신 (0) | 2022.08.31 |
---|---|
Class.newInstance()를 컨스트럭터 인수와 함께 사용할 수 있습니까? (0) | 2022.08.31 |
vuej를 사용한 다른 모바일 및 데스크톱 레이아웃 (0) | 2022.08.31 |
C에 선행 0이 있는 'printf' (0) | 2022.08.31 |
Vue 인스턴스/컴포넌트가 MVVM의 View Model만 됩니까? (0) | 2022.08.31 |