[자료구조 - C언어] 자료구조 제2강: 문자열

2022. 4. 25. 22:36CS/자료구조

728x90

//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎

 

1. 문자열

  • 문자열은 char 타입의 배열이 각 칸마다 문자 하나씩 저장되는 것

  • 대부분의 라이브러리 함수들이 문자열을 다루는 경우 문자열의 끝에 null character가 저장되어 있다는 가정하에 동작한다. → null character(’\0’)는 문자열의 끝을 표시하는 역할
    • 어디까지가 문자열이고 어디서부터가 무의미한 데이터인지 구분할 수 있는 방법이 없다.
    • printf 함수 조차도 문자열 끝에 null이 없다면 동작하지 않음
  • 문자열을 생성하는 방법
    • str[0] = ‘h’;
      • 배열 각 칸에 char 저장하기
    • char str[] = “hello”;
      • 컴파일러가 자동으로 문자열의 문자 개수를 카운트해서 크기가 6인 배열을 잡고 → 한 글자씩 넣어 저장하고 → 마지막에 null character를 채운다.
    • char * str = “hello”;
      • 6byte의 메모리 공간을 할당 → h. e. l. l. o. \n 저장 → 배열의 시작 주소를 return
      • 이 경우는 결과적으로는 위의 두 문자열과 동일하지만 완전히 동일한 것은 아니다.
        • string literal: 수정이 불가능하다.
    • 문자열 생성의 차이
      • str[]: 배열 안의 값은 바꿀 수 있지만(str[1] = “k”;) str이 전혀 다른 배열을 가리키도록 할 수 없다.
      • *str: 배열 안의 값은 바꿀 수 없지만 str이 전혀 다른 새로운 문자열(str = tmp)을 가리키도록 할 수 있다.

 

2. 문자열들의 저장

  • words[100]의 타입형은 char * words[100];이다.
    • words[100]은 주소를 가리키는 포인터 변수
      • 그 포인터 변수가 가리키는 주소의 값 타입이 char 타입 이기 때문에
  • scanf(”%d”, &a)와 scanf(”%s”, buffer)의 차이점
    • scanf(”%d”, &a): &는 변수의 주소를 추출하는 연산자이기 때문에 int타입의 경우는 &연산자 필수
    • scanf(”%s”, buffer): 배열의 이름이 실제 그 주소를 저장하기 때문에 &s 필요 없음

2-1. 포인터 변수들 간의 치환문

#include <stdio.h>
#define BUFFER_SIZE 100

int main(void){
    char * words[100];
    char * buffer[BUFFER_SIZE];
    
    int n = 0;
    
    while(n<4 && scanf("%s", buffer) != EOF){
        words[n] = buffer;
        n++;
    }
    
    for (int i=0; i<4; i++){
        printf("%s\\n", words[i]);
    }
}
//입력
asdf
qwer
zxcv
abcd

//출력 
//맨 마지막 입력만 출력: buffer라는 하나의 배열에 저장된 값이 연속해서 출력
//처음에 저장한 3개의 입력값은 사라짐
abcd
abcd
abcd
abcd
  • words[n] = buffer;
    • buffer의 주소를 저장! → 모든 배열의 칸이 buffer의 주소 값을 저장
      • buffer의 최신 주소값을 참조하기 때문에 맨 마지막 입력만 저장
        • 처음에 저장한 3개의 입력값은 사라짐

2-2. strdup

#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 100

int main(void){
    char * words[100];
    char * buffer[BUFFER_SIZE];
    
    int n = 0;
    
    while(n<4 && scanf("%s", buffer) != EOF){
        words[n] = strdup(buffer);
        n++;
    }
    
    for (int i=0; i<4; i++){
        printf("%s\\n", words[i]);
    }
    
}
//입력
aaaa
bbbb
cccc
dddd

//출력
aaaa
bbbb
cccc
dddd

  • char * words[100]; 은 어떤 문자 배열의 주소를 저장할 포인터 변수이지 칸 자체가 문자 배열인 것은 아니다.
    • strcpy(words[n], buffer); X
    • strdup(buffer); O
      • 하나의 문자열을 받아 복제본을 만들어 복제본의 주소를 리턴

 

 

 

 


부경대학교 권오흠 교수님의 [c로 배우는 자료구조 및 여러 가지 예제 실습] 강의 정리입니다. 감사합니다.

https://www.youtube.com/watch?v=mLl6EUszOOA 

 

728x90