일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 문자열 다루기
- UI
- Android
- Linked List
- C
- 콘솔 키보드 이벤트
- 코틀린
- 자료구조
- vscode
- background service
- Mat 변수
- vs code
- ws2_32.lib
- 파일입출력
- dictionary
- 진수변환기
- InfluxDBClient
- Kotlin
- 문자열파싱
- 연결리스트
- socket
- 문자열다루기
- FTP
- InfluxDB
- 소켓프로그래밍
- 딕셔너리
- flutter
- foreground service
- 메모리반환
- dart
- Today
- Total
무슨 일로 C 하셨습니까?
[C] 문자열 다루기::문자열 복사 본문
내가 만든 함수들을 사용하다 문득 하나가 빠졌다는 생각이 들었다.
문자열 복사... 어쩌면 가장 먼저 나왔어야할 함수인데...
지난번에 만든 문자열 합성 함수를 쓰면 되긴 하는데 매번 빈문자열도 같이 집어넣기 귀찮으므로 하나 만들겠다.
데이터 복사하는 것이야 어려운 일이 아니다.
int num = 3;
int ber= num;
num = 4;
printf("%d",num); // 4
printf("%d",ber); // 3
대입 연산자('=')는 오른쪽의 값을 왼쪽에 복사하는 것이기 때문에
대입 연산자를 쓰기만 해도 데이터는 복사가 된다.
그러나 데이터가 배열인 경우는 이야기가 다르다
int num[3] = {1,2,3};
int ber[3];
int* ptr;
num = ber; // 컴파일 에러
ptr = num; // 잘됨
for(int i = 0 ; i < 3 ; i ++ )
{
ber[i] = num[i];
num[i]++;
printf("%d ",ber[i]); // 1, 2, 3
printf("%d ",ptr[i]); // 2, 3, 4
}
배열 변수의 이름 자체는 시작주소를 나타내는 포인터이기 때문에
대입 연산자 자체가 안들어간다. 사실 자세한건 나도 잘 모르겠다.
배열에 대입연산자를 쓰려거든 포인터를 사용하는 방법 밖엔 없다.
그러나 이러한 방법도 내가 원하는 결과가 아닌게
포인터에 주소만 복사했을 뿐 데이터를 복사한게 아니라 원본을 수정하면 같이 수정되는 현상이 발생한다.
따라서 배열을 복사하려거든 일일이 하나씩 데이터를 복사해서 저장하는 수 밖에 없다.
고로 문자의 배열인 문자열도 위의 제약사항을 피해갈 순 없다.
char* StringCopy(char* Src) {
return NULL;
}
가볍게 이름부터 만들고 시작하자.
여기서 알아야할 점은 복사하려는 문자열의 크기가 고정적이지 않을 확률이 높기 때문에
입력받은 문자열을 잘 복사해서 반환시켜주는 함수로 계획했다.
char* StringCopy(char* Src) {
int len = StringLength(Src);
// int len = strlen(Src);
char* data = (char*)malloc((sizeof(char) * len) + 1);
return NULL;
}
복사하려는 문자열의 크기만큼 동적배열을 할당하자.
(문자열을 복사하려면 최소한 그 크기만큼의 배열이 할당되어 있어야 하는건 당연하다)
* 배열의 크기를 1만큼 더 크게 만드는 이유는 문자열 끝에 종료 문자를 넣기 위해서다.
이전에 만든 문자열 길이를 재는 함수를 써도 되지만 모른다면 <string.h>에서 strlen()함수를 쓰자
근데 그럴거면 이 함수를 직접 만들지도 않았겠지
char* StringCopy(char* Src) {
int len = StringLength(Src);
if (Src == NULL) return NULL;
char* data = (char*)malloc((sizeof(char) * len) + 1);
for (int i = 0; i < len; i++) {
data[i] = Src[i];
}
data[len] = 0;
return data;
}
나머진 어렵지 않다. 각 배열 칸에 맞게 데이터를 하나씩 옮겨 담고 마지막에 종료문자를 넣어준다.
그리고 반환하면 되겠다.
주의할 점은 이렇게 만들어진 동적배열은 힙 메모리에 위치해 있기 때문에
free()로 반환해주지 않으면 메모리를 낭비할 수 있으니 후에 잘 반환해주도록 하자.
'C - 이걸 굳이? > 유틸리티' 카테고리의 다른 글
[C] 파일 입출력 (0) | 2021.05.12 |
---|---|
[C] 키보드 이벤트 (0) | 2021.01.25 |
[C] 메모리 반환 (0) | 2020.10.15 |
[C] 자료구조::딕셔너리 (Dictionary) _ 2 (2) | 2020.10.15 |
[C] 자료구조::딕셔너리 (Dictionary) (1) | 2020.10.13 |