C언어 : 배열과 문자열

지환·2022년 1월 7일
0

C언어

목록 보기
15/37
post-thumbnail

출처 ㅣ DO IT C언어 - 김성엽

문자열과 배열

  • 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 함수를 사용하면 에러가 발생한다. 이에 대해 다른 방법이 뭐가 있을지 알아보자.

strcat

  • 형태 : strcat(char _Dest, const char _Source)

  • _Dest : 받을 문자열, _Source : 붙일 문자열

  • 받을 문자열 뒤에 붙일 문자열을 덧붙인다.

  • 받을 문자열 + 붙일 문자열이 받을 문자열의 최대 길이보다 크면 에러가 발생한다.

strcat_s

  • 형태 : strcat_s(char _Dst, rsize_t_SizeInByte, const char _Src)

  • _Dst : 받을 문자열, rsize_t_SizeInByte : 대상 문자열 버퍼의 크기, _Src : 붙일 문자열

  • 받을 문자열 뒤에 붙일 문자열을 덧붙인다.

  • 받을 문자열 + 붙일 분자열이 대상 문자열 버퍼의 크기보다 크면 에러가 발생한다.

strcpy

  • 형태 : strcpy(char _Dest, const char _Source)

  • _Dest : 받을 문자열, _Source : 복사할 문자열

  • 복사할 문자열을 받을 문자열에 복사한다.

  • 받을 문자열이 복사할 문자열보다 짧다면 에러가 발생한다.

  • stack around

strcpy_s

  • 형태 : 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);
}

  • 이번 시간까지 문자열 배열을 알아봤다. 다음 시간엔 2차원 배열에 대해 알아보자.
profile
아는만큼보인다.

0개의 댓글