[자료구조 - C언어] 자료구조 제2강: 문자열
2022. 4. 25. 22:36ㆍCS/자료구조
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)을 가리키도록 할 수 있다.
- str[0] = ‘h’;
2. 문자열들의 저장
- words[100]의 타입형은 char * words[100];이다.
- words[100]은 주소를 가리키는 포인터 변수
- 그 포인터 변수가 가리키는 주소의 값 타입이 char 타입 이기 때문에
- words[100]은 주소를 가리키는 포인터 변수
- 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개의 입력값은 사라짐
- buffer의 최신 주소값을 참조하기 때문에 맨 마지막 입력만 저장
- buffer의 주소를 저장! → 모든 배열의 칸이 buffer의 주소 값을 저장
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
'CS > 자료구조' 카테고리의 다른 글
[자료구조 - C언어] 자료구조 제5강: 전화번호부 v2.0 (0) | 2022.05.06 |
---|---|
[자료구조 - C언어] 자료구조 제4강: 전화번호부 v1.0 (0) | 2022.04.28 |
[자료구조 - C언어] 자료구조 제3강: 문자열 예제 (0) | 2022.04.26 |
[자료구조 - C언어] 자료구조 제1강: 동적메모리할당 (0) | 2022.04.18 |
[자료구조 - C언어] 자료구조 제1강: C언어에서 포인터, 배열, 포인터 연산 (0) | 2022.04.17 |