티스토리 뷰

3. 문자열

문자열은 문자의 배열이고, 배열 마지막에는 문자열의 끝을 나타내는 \0(null 종단 문자)이 저장된다. 문자열을 출력하기 위해서는 포인터(*)를 사용해야 한다. char형 배열의 이름은 결국 문자열을 가리키는 포인터가 된다.

 

말하자면 C언어에서는 string을 char *이라고 말한다고 볼 수 있다. 

#include <stdio.h>

int main(void){
    char *str = "Hello World";
    printf("%s\n", str);
    
    return 0;
}

 

 

4. 문자열 비교

문자의 배열의 이름은 문자열을 가리키는 포인터인데, 더 상세하게 말하면 배열에 저장된 첫 번째 문자를 가리킨다. 배열에 저장된 문자 하나하나의 주소를 확인해보자.

#include <stdio.h>

int main(void)
{
  char *s = "hello";
  printf("%s\n", s);
  printf("%p\n", s);
  printf("%p\n", &s[0]);
  printf("%p\n", &s[1]);
  printf("%p\n", &s[2]);
  printf("%p\n", &s[3]);
  printf("%p\n", &s[4]);
}

배열에 저장된 문자마다의 주소를 확인해보면, 배열명으로 확인한 주소와 배열에 저장된 첫 번째 문자의 주소가 동일함을 확인할 수 있다. 그리고 배열에 저장된 문자의 주소가 1씩 증가하고 있음을 알 수 있다. 그러므로 아래와 같은 방법으로 배열에 저장된 문자열을 출력할 수 도 있다.

#include <stdio.h>

int main(void)
{
  char *s = "hello";
  printf("%c", *s);
  printf("%c", *(s+1));
  printf("%c", *(s+2));
  printf("%c", *(s+3));
  printf("%c", *(s+4));
}

그리고 문자열의 경우 비교연산자는 문자열이 저장된 주소를 비교하기 때문에, 비교 연산자를 사용해 문자열을 비교할 수 없다.

 

 

5. 문자열 복사

문자열은 비교 시에도 저장된 주소를 비교하고, 대입 연산자를 사용해도 주소값을 저장하기 때문에, 두 개의 문자열을 실제로 메모리상에서 복사하려면 <string.h> 헤더 파일의 strcpy()를 사용해야 한다. 

혹은 <stdlib.h> 헤더 파일의 동적 메모리 할당 함수 malloc()을 사용해 임시로 메모리를 할당받아 저장할 수도 있다.

 

동적 메모리

✔  동적 메모리 (Dynamic Memory Allocation) : 메모리의 유연한 관리

✔  동적 메모리 할당 : 프로그램 실행 도중, 동적으로 메모리를 할당받는 것

✔  프로그램에서는 필요한 만큼의 메모리를 시스템으로부터 포인터에 할당받아 사용하고

✔  사용이 끝나면 시스템에 free( )을 사용해 명시적으로 메모리를 반납하므로 메모리를 효율적으로 사용할 수 있다

#include <stdio.h>
#include <stdlib.h>

int main(void){
  int *p;  
  p = (int *)malloc(sizeof(int)); 

  //동적 메모리 사용하기
  *p = 100;
  printf("%d\n", *p);
  
  /*동적 메모리 사용 후 반환하기*/
  free(p);
  return 0;
}

✔  malloc( sizeof(int) ) = int타입의 크기만큼 메모리를 할당 (int = 4바이트 → pi에 4바이트 할당)

✔  malloc함수는 void* 을 반환하고 malloc을 사용해 동적 메모리를 할당하는 주소는 void가 아니므로, 형 변환이 필요하다(int *)

✔  malloc함수를 사용할 때마다 형 변환을 계속하는 것은 불편하기 때문에 이제는 형 변환을 생략해도 오류가 발생하지는 않는다

✔  하지만 명시적으로 형 변환하는 것을 추천

 

<string.h>

✔  strlen( ) : 문자열의 길이를 확인하는 메서드

✔  strcmp( str1, str2 ) : 두 가지 문자의 사전적 순서를 비교하는 메서드

✔  strcpy( str1, str2 ) : str2의 문자열을 복사해 str1에 저장하는 메서드 → 문자열을 저장할 때 주로 사용

✔  strcat( str1, str2 ) : 두 개의 문자열을 붙임

✔  strstr( str1, str2 ) : 두 개의 문자열을 인자로 받아 첫 번째 문자열 내부에 두 번째 문자열이 나오는지 탐색

 

 

 

 

[출처] 부스트코스 | 모두를 위한 컴퓨터 과학(CS50 2019)

댓글
«   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