Programing

C에서 char 배열을 복사하는 방법?

c10106 2022. 4. 29. 20:56
반응형

C에서 char 배열을 복사하는 방법?

C에는 다음과 같은 두 개의 문자 배열이 있다.

char array1[18] = "abcdefg";
char array2[18];

값을 복사하는 방법array1array2그냥 이렇게 해도 될까?array2 = array1?

직접 할 수는 없다.array2 = array1이 경우 배열의 주소를 조작하기 때문에(char *() 및 내적 가치가 아닌 (char).

개념적으로 당신이 원하는 것은 당신의 소스(array1)의 모든 문자를 반복해서 목적지(array2)에 복사하는 것이다.이것을 하는 데는 여러 가지 방법이 있다.예를 들어 루프를 위한 간단한 글을 쓰거나 를 사용할 수 있다.

말하자면, 현을 사용하는 것이 권장되는 방법이다.예를 들어 버퍼 오버플로(특히 위험할 경우)와 같은 일반적인 오류를 방지한다.array1사용자 입력으로 채워짐: 키보드, 네트워크 등).이와 같이:

// Will copy 18 characters from array1 to array2
strncpy(array2, array1, 18);

@Prof.팔켄은 논평에서 이렇게 말했다.strncpy 악할있다.대상 버퍼가 소스 버퍼(포함)를 포함할 만큼 충분히 큰지 확인하십시오.\0줄의 끝에.

어레이가 문자열 어레이가 아닌 경우 다음을 사용하십시오.memcpy(array2, array1, sizeof(array2));

다른 사람들이 언급한 바와 같이 문자열은 다음과 같이 복사된다.strcpy()또는 그 변형.어떤 경우에는, 당신은snprintf()뿐만 아니라.

구조 할당에서 원하는 방식으로만 배열을 할당할 수 있음:

typedef struct { char a[18]; } array;
array array1 = { "abcdefg" };
array array2;

array2 = array1;

배열을 함수에 전달하면 배열을 할당할 수 있는 것으로 나타나지만 이는 의미론의 사고일 뿐이다.C에서 배열은 배열의 첫 번째 멤버의 주소 값을 가진 포인터 유형으로 분해되며, 이 포인터가 전달된다.즉, 함수에서 배열 매개 변수는 포인터일 뿐이라는 겁니다.할당은 포인터 할당일 뿐이다.

void foo (char x[10], char y[10]) {
    x = y;    /* pointer assignment! */
    puts(x);
}

어레이 자체는 기능에서 복귀한 후에도 변함이 없다.

배열에 대한 이러한 "decay to pointer value" 의미 부여가 작동하지 않는 이유다.l-값에는 배열 유형이 있지만 r-값은 썩은 포인터 유형이므로 할당은 호환되지 않는 유형 사이에 있다.

char array1[18] = "abcdefg";
char array2[18];
array2 = array1; /* fails because array1 becomes a pointer type,
                    but array2 is still an array type */

「포인터 값 결정」의 의미론이 도입된 이유에 대해서는, C의 전신과의 소스 코드 호환성을 달성하기 위해서였다.자세한 내용은 The Development of the C Language를 참조하십시오.

배열을 할당할 수 없음, 이름은 변경할 수 없는 상수임.

다음을 사용하여 내용을 복사할 수 있다.

strcpy(array2, array1);

소스가 유효한 문자열이며, 당신의 예와 같이 대상이 충분히 크다고 가정한다.

모든 종류의 문제를 일으킬 수 있는 종료되지 않은 문자열로부터 보호하려면 다음과 같이 문자열을 복사하십시오.

char array1[18] = {"abcdefg"};
char array2[18];

size_t destination_size = sizeof (array2);

strncpy(array2, array1, destination_size);
array2[destination_size - 1] = '\0';

그 마지막 줄은 사실 중요해, 왜냐하면strncpy()항상 종료 문자열이 null인 것은 아니다.(대상 버퍼가 너무 작아서 전체 소스 문자열을 포함할 수 없는 경우 sntrcpy()는 대상 문자열을 null로 종료하지 않는다.)

strncpy()의 맨 페이지에는 "경고: src의 번째 nbytenull byte가 없다면 destest에 배치된 문자열은 null-terminal되지 않을 것"이라고까지 적혀 있다.

strncpy()가 다소 이상하게 행동하는 이유는 그것이 실제로 문자열을 복사하는 안전한 방법으로 의도된 것이 아니기 때문이다.

또 다른 방법은 strcpy()의 안전한 대체물로 snprintf()를 사용하는 것이다.

snprintf(array2, destination_size, "%s", array1);

(팁 고마워 jxh)

음, 기술적으로 당신은…

typedef struct { char xx[18]; } arr_wrap;

char array1[18] = "abcdefg";
char array2[18];

*((arr_wrap *) array2) = *((arr_wrap *) array1);

printf("%s\n", array2);     /* "abcdefg" */

그러나 그것은 매우 아름답게 보이지는 않을 것이다.

…C 전처리기구를 사용하지 않는 한…

#define CC_MEMCPY(DESTARR, SRCARR, ARRSIZE) \
    { struct _tmparrwrap_ { char xx[ARRSIZE]; }; *((struct _tmparrwrap_ *) DESTARR) = *((struct _tmparrwrap_ *) SRCARR); }

다음 작업을 수행하십시오.

char array1[18] = "abcdefg";
char array2[18];

CC_MEMCPY(array2, array1, sizeof(array1));

printf("%s\n", array2);     /* "abcdefg" */

그리고 그것은 단순한 것이 아니라 어떤 데이터 유형에서도 작동될 것이다.char:

int numbers1[3] = { 1, 2, 3 };
int numbers2[3];

CC_MEMCPY(numbers2, numbers1, sizeof(numbers1));

printf("%d - %d - %d\n", numbers2[0], numbers2[1], numbers2[2]);     /* "abcdefg" */

(네, 위 코드는 항상 작업할 있도록 부여되어 있으며 휴대 가능)

다음과 같이 표시되어야 한다.

void cstringcpy(char *src, char * dest)
{
    while (*src) {
        *(dest++) = *(src++);
    }
    *dest = '\0';
}
.....

char src[6] = "Hello";
char dest[6];
cstringcpy(src, dest);

데이터 복사에 memcpy()를 사용하는 것을 추천한다.또한 다른 에 버퍼 할당 시array2 = array1두 어레이 모두 동일한 메모리와 어레이2의 arrary1 디플렉스의 변화를 가지고 있다.하지만 우리는 memcpy를 사용한다. 두 버퍼는 서로 다른 어레이를 가지고 있다.strcpy와 관련 함수는 NULL 문자를 복사하지 않기 때문에 memcpy()를 추천한다.

c 기능만 아래...c++ char 배열을 한 다음 문자열 복사본을 사용하고 문자열 토큰키소르 함수를 사용하십시오.c++는 어떤 일도 더 어렵게 만들었다.

#include <iostream>
#include <fstream>
#include <cstring>
#define TRUE 1
#define FALSE 0
typedef int Bool;
using namespace std;
Bool PalTrueFalse(char str[]);
int main(void)
{
char string[1000], ch;
int i = 0;
cout<<"Enter a message: ";

while((ch = getchar()) != '\n') //grab users input string untill 
{                               //Enter is pressed
    if (!isspace(ch) && !ispunct(ch)) //Cstring functions checking for
    {                                //spaces and punctuations of all kinds
        string[i] = tolower(ch); 
        i++;
    }
}
string[i] = '\0';  //hitting null deliminator once users input
cout<<"Your string: "<<string<<endl; 
if(PalTrueFalse(string)) //the string[i] user input is passed after
                        //being cleaned into the null function.
    cout<<"is a "<<"Palindrome\n"<<endl;
else
   cout<<"Not a palindrome\n"<<endl;
return 0;
}

Bool PalTrueFalse(char str[])
{
int left = 0;
int right = strlen(str)-1;
while (left<right)
{
   if(str[left] != str[right]) //comparing most outer values of string
       return FALSE;          //to inner values.
   left++;
   right--;
}
return TRUE;
}
array2 = array1;

c에서 지원되지 않음.그것을 하려면 strcpy()와 같은 기능을 사용해야 한다.

정수 타입의 경우

#include <string.h>    

int array1[10] = {0,1,2,3,4,5,6,7,8,9};
int array2[10];


memcpy(array2,array1,sizeof(array1)); // memcpy("destination","source","size")

복사할 배열을 할당할 수 없음.하나의 내용을 다른 요소로 복사하는 방법은 다음과 같은 여러 요소에 따라 달라진다.

을 위해char어레이(소스 어레이가 null인 것을 알고 있고 null 터미네이터를 포함하여 소스 어레이의 문자열에 맞게 대상 어레이가 충분히 큰 경우 사용strcpy():

#include <string.h>

char array1[18] = "abcdefg";
char array2[18];

...

strcpy(array2, array1);

대상 배열이 충분히 큰지 알 수 없지만 소스가 C 문자열이고 대상이 적절한 C 문자열이 되도록 하려면snprinf():

#include <stdio.h>

char array1[] = "a longer string that might not fit";
char array2[18];

...

snprintf(array2, sizeof array2, "%s", array1);

인 것은 스를 할 수 .memcpy:

#include <string.h>

char array1[28] = "a non null terminated string";
char array2[28];

...

memcpy(array2, array1, sizeof array2);

위와 같은 것은 나에게 아무런 효과가 없었다.이것은 완벽하게 작동한다.name여기 있다char *name그 기능을 통해 전달되는 것

  1. 을 이해하다char *name사용.strlen(name)
  2. 그것을 항상변수에 저장하는 것은 중요하다.
  3. 동일한 길이 크기 생성char배열하다
  4. 베끼다name에 만족하다temp사용.strcpy(temp, name);

원본 콘텐츠를 다시 가져오려면 원하는 대로 사용하십시오.strcpy(name, temp);임시로 에 복사하다.name그리고 vaila는 완벽하게 작동한다.

    const int size = strlen(name);
    char temp[size];
    cout << size << endl;
    strcpy(temp, name);

참조URL: https://stackoverflow.com/questions/16645583/how-to-copy-a-char-array-in-c

반응형