티스토리 뷰

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언어 코딩 도장 / 위키백과

댓글
«   2024/12   »
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 31
최근에 올라온 글
글 보관함
Total
Today
Yesterday