문자열과 배열
C언어에서 문자를 저장하는 데 적합한 자료형은 char형이다.
그렇기 때문에 문자열을 저장하려면 char형 변수를 그룹으로 묶어서 관리하는 char 배열을 사용해야 된다.
예를 들어 "happy"를 저장하려면 'h','a','p','p','y'외에 이 문자열이 5개로 이루어져 있다는 정보도 같이 저장된다.
입력하려는 문자의 끝에 NULL문자 0을 추가로 입력해서 ' 이 배열에 저장된 정보는 문자열이다' 라고 컴파일러에게 알려준다.
char data[6] = {'h', 'a', 'p', 'p', 'y', 0};
이번에는 배열에 문자열을 저장하고 화면에 출력하는 연습을 하겠다. printf 함수로 문자열 %s를 사용한다.
printf 함수는 지정한 메모리 그룹의 요소 값이 NULL 문자 0이 나올 때까지 문자들을 반복적으로 출력한다.
void main()
{
char data[6] = { 'h','a','p','p',0 };
char ment[] = "C programing";
printf("%s\n", data);
printf("%s\n", ment);
}
<결과>
저장된 문자열의 길이 구하기.
배열 크기가 항상 문자열의 길이와 같게 만들어지는 것은 아니다.
배열에 저장된 문자열의 길이를 알기 위해서 문자열의 끝(EOL) 찾는 코드가 필요하다. 문자열의 길이를 계산하는 코드는 다음과 같다.
char data[6] = "happy";
int count = 0;
while(data[count] != 0) { //data 요소 값이 NULL 문자 0이면 문자열의 끝이라는 뜻이다.
count++; //문자열의 끝이 아니면 문자 개수를 하나 증가시킨다.
}
다음 코드를 보자.
int GetStringLength(char data[])
// 매개변수 data[] 안에 숫자를 적지 않아도 된다.
//숫자를 적어도 오류가 발생하진 않지만, 실제로 전달되는 배열의 크기에 영향을 받기 때문에 무시한다.
{
int count = 0;
while (data[count]) count++; // while(data[count] != 0) 과 같은 뜻
return count;
}
int main()
{
int data_length;
char data[10] = { 'h', 'a', 'p', 'p', 'y', 0, };
data_length = GetStringLength(data);
printf("data length = %d\n", data_length);
}
main 함수의 data 변수에 저장된 문자열의 길이를 구하기 위해서 GetStringLength 함수를 호출한다.
GetStringLength 함수가 문자열의 길이를 계산하려면 main 함수에 선언한 data 변수에 저장되어 있는 값을 알아야 한다.
data_length = GetStringLength(data); 함수의 매개변수로 배열의 이름인 data를 전달했고, GetStringLength 함수에서 매개변수 값을 전달 받아 사용한다.
data 변수는 값이 한 개가 아니라 여러 개의 값으로 이루어진 배열 변수다.
int GetStringLength(char data[]) 형태로 선언하면 main 함수에서 선언한 data 배열 변수의 크기로 GetStringLength 함수에 배열 변수 data가 선언되고, main 함수의 data 변수에 저장되어 있던 값들도 그대로 복사된다.
GetStringLength 함수를 호출할 때 16행처럼 배열의 이름만 사용하면 된다. 그리고 배열의 값을 다른 함수에 전달하고 싶을 떄는 배열의 이름만 매개 변수로 전달하면 된다.
문자열을 다루는 c 내장 함수
#include <stdio.h>
#include <string.h>
int main()
{
int data_length;
char data[10] = { 'h', 'a', 'p', 'p', 'y', 0, };
data_length = strlen(data);
printf("data length = %d\n", data_length);
}
int main()
{
char data[10] = { 'a', 'b', 'c', 0, };
char result[16];
strcpy_s(result, data); //data에 저장된 문자열을 result로 복사함.
strcat_s(result, "def"); // result 값의 맨 뒤에 def를 덧붙임
printf("%s + \"def\" = %s\n", data, result);
}
strcpy_s등의 _s 류의 문자열처리 함수에 대해
형태 : strcat(char _Dest, const char _Source)
_Dest : 받을 문자열, _Source : 붙일 문자열
받을 문자열 뒤에 붙일 문자열을 덧붙인다.
받을 문자열 + 붙일 문자열이 받을 문자열의 최대 길이보다 크면 에러가 발생한다.
형태 : strcat_s(char _Dst, rsize_t_SizeInByte, const char _Src)
_Dst : 받을 문자열, rsize_t_SizeInByte : 대상 문자열 버퍼의 크기, _Src : 붙일 문자열
받을 문자열 뒤에 붙일 문자열을 덧붙인다.
받을 문자열 + 붙일 분자열이 대상 문자열 버퍼의 크기보다 크면 에러가 발생한다.
형태 : strcpy(char _Dest, const char _Source)
_Dest : 받을 문자열, _Source : 복사할 문자열
복사할 문자열을 받을 문자열에 복사한다.
받을 문자열이 복사할 문자열보다 짧다면 에러가 발생한다.
stack around
형태 : strcpy_s(char _Dst, rsize_t_SizeInByte, const char _Src)
_Dst : 받을 문자열, rsize_t_SizeInByte : 대상 문자열 버퍼의 크기, _Src : 붙일 문자열
받을 문자열에 복사할 문자열을 대상 문자열 버퍼의 크기만큼 복사한다.
대상 문자열 버퍼의 크기가 복사할 문자열보다 작다면 에러가 발생한다.
lbuffer is too small
int main()
{
char data[10] = { 'a', 'b', 'c', 0, };
char result[16];
strcpy_s(result,sizeof(result) ,data); //data에 저장된 문자열을 result로 복사함.
strcat_s(result,sizeof(result), "def"); // result 값의 맨 뒤에 def를 덧붙임
printf("%s + \"def\" = %s\n", data, result);
}