리눅스 C-언어 초급과정
12. 문자열(string)
다유데브
2022. 11. 16. 11:07
반응형
1) 목표
- 문자열 이해하기
- 문자열 활용하기
2) 설명
▶ c언어에서 문자열이라는 것은 char, int와 같이 타입이 존재하는건 아닙니다.
문자열(string)은 null(널)로 끝나는 문자의 집합입니다.
// 문자 타입의 배열
char cbuf[5] = {'h', 'e', 'l', 'l', 'o'};
// 문자 타입의 배열 이면서 마지막값이 null이므로 문자열이 됩니다.
// null 표현 : '\0', 0x00, 0
char sbuf[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
▶ 차이점을 아시겠습니까?
cbuf[5] 배열은 마지막 문자가 null이 아니므로 문자열이 아닙니다.
sbuf[6] 배열은 마지막 문자가 null이므로 문자열입니다.
※ 마지막 null문자도 1바이트를 차지합니다.
그래서 문자열로 만드실 경우 문자수 + 1로 배열/메모리를 확보하셔야 합니다.
3-1) 예제프로그램
▶ vi string.c
#include <stdio.h>
int main() {
char sbuf[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
int i;
// 배열의 값을 출력해 봅니다.
printf("----- sbuf 출력 -----\n");
for (i = 0; i < 6; i++) {
printf("sbuf[%d]=%c\n", i, sbuf[i]);
}
// 문자열을 출력합니다.
printf("----- 문자열 출력 -----\n");
printf("sbuf[%s]\n", sbuf);
return 0;
}
▶ 컴파일/실행
~/c-lecture (master ✘)✭ ᐅ gcc -o string string.c
~/c-lecture (master ✘)✭ ᐅ ./string
----- sbuf 출력 -----
sbuf[0]=h
sbuf[1]=e
sbuf[2]=l
sbuf[3]=l
sbuf[4]=o
sbuf[5]=
----- 문자열 출력 -----
sbuf[hello]
~/c-lecture (master ✘)✭ ᐅ
▶ 분석
char sbuf[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
- char타입 배열을 선언과 동시에 값을 할당하는데 마지막에 null문자('\0')를 넣어서 문자열로 만듭니다.
- for 문으로 배열의 값을 출력합니다.
printf("sbuf[%s]\n", sbuf);
- printf문의 서식 %s 로 문자열을 출력합니다.
%s 서식을 사용하실때 해당하는 값은 변수명만을 사용했습니다.
(포인터에서 자세히 다루도록 하겠습니다.)
3-2) 아스키코드값 출력하기
▶ vi string2.c
#include <stdio.h>
int main() {
char sbuf[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
int i;
// 배열의 값을 출력해 봅니다.
printf("----- sbuf 아스키코드 출력 -----\n");
for (i = 0; i < 6; i++) {
printf("sbuf[%d]=%c:[%d]:[%x]\n", i, sbuf[i], sbuf[i], sbuf[i]);
}
return 0;
}
▶ 컴파일/실행
~/c-lecture (master ✘)✭ ᐅ gcc -o string2 string2.c
~/c-lecture (master ✘)✭ ᐅ ./string2
----- sbuf 아스키코드 출력 -----
sbuf[0]=h:[104]:[68]
sbuf[1]=e:[101]:[65]
sbuf[2]=l:[108]:[6c]
sbuf[3]=l:[108]:[6c]
sbuf[4]=o:[111]:[6f]
sbuf[5]=:[0]:[0]
~/c-lecture (master ✘)✭ ᐅ
▶ 분석
printf("sbuf[%d]=%c:[%d]:[%x]\n", i, sbuf[i], sbuf[i], sbuf[i]);
- %c다음의 [%d]:[%x]가 있습니다.
printf문 서식에서 %d는 알고 계신데로 정수형이고 %x는 16진수로 표현하는 서식입니다.
같은값 sbuf[i] 를 %c, %d, %x로 출력할 수 있습니다. - 출력중 알파벳 h 값은 아스키코드값은 104이고 16진수로는 0x68인 것을 나타냅니다.
(c언어에서 16진수를 표시할때 0x를 붙입니다.) - man ascii 로 매뉴얼을 보시면 더 자세히 알수 있습니다.
3-3) string 선언 예제 프로그램
▶ vi string3.c
#include <stdio.h>
int main() {
// 문자열로 선언
char sbuf[] = "hello";
int i;
// 배열의 값을 출력해 봅니다.
printf("----- sbuf 아스키코드 출력 -----\n");
for (i = 0; i < 6; i++) {
printf("sbuf[%d]=%c:[%d]:[%x]\n", i, sbuf[i], sbuf[i], sbuf[i]);
}
return 0;
}
▶ 컴파일/실행
~/c-lecture (master ✘)✭ ᐅ gcc -o string3 string3.c
~/c-lecture (master ✘)✭ ᐅ ./string3
----- sbuf 아스키코드 출력 -----
sbuf[0]=h:[104]:[68]
sbuf[1]=e:[101]:[65]
sbuf[2]=l:[108]:[6c]
sbuf[3]=l:[108]:[6c]
sbuf[4]=o:[111]:[6f]
sbuf[5]=:[0]:[0]
~/c-lecture (master ✘)✭ ᐅ
▶ 분석
- 위의 예제와 동일한 결과를 나타냅니다.
- 배열에 문자열을 바로 할당하는 문법입니다.
char sbuf[] = "hello";
이 선언은 char sbuf[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; 와 같은 효과를 냅니다.
문자열을 바로 선언해서 사용하고자 할 경우 편리합니다.
※ 문자열을 좀 더 자세히 다룰때 다른 형태를 살펴보겠습니다.
여기서는 문자열을 선언할떄 이런형태로 선언하는구나. 정도만 아셔도 됩니다.
반응형