C에서 char 배열을 복사하는 방법?
C에는 다음과 같은 두 개의 문자 배열이 있다.
char array1[18] = "abcdefg";
char array2[18];
값을 복사하는 방법array1
로array2
그냥 이렇게 해도 될까?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의 첫 번째 nbyte 중 null 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
그 기능을 통해 전달되는 것
- 을 이해하다
char *name
사용.strlen(name)
- 그것을 항상변수에 저장하는 것은 중요하다.
- 동일한 길이 크기 생성
char
배열하다 - 베끼다
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
'Programing' 카테고리의 다른 글
변환 장치의 일부에 대해서만 GCC 경고를 선택적으로 비활성화 (0) | 2022.05.02 |
---|---|
Vuex 디스패치가 반환되지 않음 (0) | 2022.05.02 |
ConcurrentHashMap 대 동기화된 해시맵 (0) | 2022.04.29 |
현재 C 또는 C++ 표준 문서는 어디에서 찾을 수 있는가? (0) | 2022.04.29 |
Vuex 2.0 디스패치 대 커밋 (0) | 2022.04.29 |