티스토리 뷰
2021.03.04.목
동적 할당을 사용한 문자열 처리
✔ 동적 할당은 프로그램의 효율을 높이기 위한 방법 중 하나이다.
✔ 입력할 문자열의 길이를 알 수 없는 경우, 저장 공간을 넉넉하게 선언하는데, 이는 저장 공간의 낭비를 초래한다.
✔ 동적 할당을 사용하게 되면 입력 문자열의 길이에 맞게 저장 공간을 사용할 수 있다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char temp[80]; // 임시 char 배열
char* str[3]; // 동적 할당 영역을 연결할 포인터 배열
for(int i = 0; i < 3; i++){
printf("문자열을 입력하세요 : ");
gets(temp); // 문자열 입력
str[i] = (char*)malloc(strlen(temp)+1);
strcpy(str[i], temp); // 동적 할당 영역에 문자열 복사
}
// 입력된 문자열 출력
for (int i = 0; i < 3; i++){
printf("%s\n", str[i]);
}
// 동적 메모리 해제
for (int i = 0; i < 3; i++) {
free(str[i]);
}
return 0;
}
✔ 먼저 문자열을 char형 배열 temp에 임시로 저장한다.
✔ char형 포인터 배열의 길이만큼 반복문을 사용해서 문자열 길이를 확인한다.
✔ 마지막 null문자를 위해 +1 만큼의 크기로 동적 메모리를 할당받아와서 char형 포인터 변수 배열의 요소로 저장.
동적 할당 영역에 저장한 문자열을 함수로 처리
✔ char 배열의 문자열을 출력하는 함수는 배열명을 저장할 이중 포인터를 매개변수로 선언해 사용한다.
✔ 포인터 배열의 문자열을 출력하는 함수도 포인터 배열의 이름을 저장할 이중 포인터 매개변수가 필요하다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_str(char** ps); // 동적 할당 영역의 문자열을 출력하는 함수
int main(void){
char temp[80];
char* str[21] = { 0 };
int i = 0;
while (i < 20) {
printf("문자열을 입력하세요 : ");
gets(temp);
if (strcmp(temp, "end") == 0) break;
str[i] = (char*)malloc(strlen(temp) + 1);
strcpy(str[i], temp);
i++;
}
print_str(str);
for (i = 0; str[i] != NULL; i++){
free(str[i]);
}
return 0;
}
//인자 값으로 포인터 변수를 받아오기때문에
//포인터 변수를 저장할 수 있는 공간인 이중 포인터를 매개변수로 선언한다.
void print_str(char** ps){
int i=0;
while(ps[i]!=NULL){
printf("%s\n", ps[i]);
i++;
}
}
main함수의 명령행 인수 사용
✔ 프로그램의 실행 방법은 운영체제마다 다르다.
✔ 윈도우는 아이콘을 더블클릭하여 실행하고 도스나 유닉스는 실행 파일의 이름을 명령행에 직접 입력하여 실행한다.
✔ 후자의 경우, 프로그램 이름뿐만 아니라 프로그램에 필요한 정보를 함께 전달하기도 하는데 이를 모두 명령행 인수라고 한다.
int main(int argc, char **argv)
✔ 이러한 명령행 인수를 받기 위해서는 main() 함수에 매개변수를 선언해야 한다.
✔ 모든 프로그램은 시작하자마자 main() 함수를 호출하기 때문에 명령행에서 프로그램을 실행하며 입력받은 인수는 main() 함수의 매개변수여야 한다.
argc : argument count //int
argv : argument vector //이중 포인터
✔ 매개 변수의 임의는 임의로 작성할 수 있지만 관례적으로 argc와 argv를 사용한다.
✔ 의미는 각각 위와 같으며, argc는 명령행 인수의 개수를 의미하고, argv는 명령행에서 입력한 문자열의 주소를 저장한다.
./main first_arg second_arg
✔ 만약 위와 같이 실행한다면 인수는 총 3개가 된다.
✔ 첫 번째 인수는 파일의 경로와 파일명이고, 이후의 인수는 문자열 상수이다.
✔ 인수의 개수는 int형 변수 argc에 저장되고, 3개의 문자열의 주소는 이중 포인터 argv에 저장된다.
✔ 이렇게 저장한 문자열의 주소를 사용해 명령행 인수로 받아온 문자열을 아래와 같이 출력할 수 있다.
#include <stdio.h>
int main(int argc, char **argv){
for(int i=0; i<argc; i++){
printf("%s\n", argv[i]);
}
return 0;
}
✔ char형 배열은 결국 문자열을 의미하고, 문자열의 주소를 이중포인터 argv에 저장하였으므로
✔ for문을 사용해 위와 같은 형태로 출력할 수 있다.
[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩 도장 / 위키백과
'BackEnd > C' 카테고리의 다른 글
[22일차] 2. 구조체 변수 활용 (0) | 2021.03.05 |
---|---|
[22일차] 1. 구조체와 멤버 (0) | 2021.03.05 |
[21일차] 1. 동적 메모리 할당 함수 (0) | 2021.03.04 |
[20일차] 5. 함수 포인터/void 포인터 (0) | 2021.03.03 |
[20일차] 4. 2차원 배열과 배열 포인터 (0) | 2021.03.03 |