단어는 보통 알파벳을 연속적으로 적고 그 순서에 따라 의미가 달라진다.
이런 단어를 컴퓨터 메모리에서 데이터로 처리하려면 순서에 맞게 연속적으로 저장해야하는데,
이때 사용하면 아-주 적합한 자료형이 바로 배열이다.
특히 알파벳 문자 같은 경우 한 바이트로 표현이 가능하므로, char형 배열을 사용하는 것이 적합하다!
char 형 배열의 선언과 초기화
char형 배열을 선언할 때는 저장한 문자열의 길이보다 최소한 하나 이상 크게 선언해야한다.
예를들어 문자열 'apple'을 저장하려할때, 배열은 배열 요소의 개수가 최소한 6 개 이상이어야한다. 즉, 남는 공간이 하나 이상은 있어야 한다는 것!
왜일까?
널문자(\0) 때문이다.
char str[100] = "applejam";
초기화한 문자들은 배열의 처음부터 차례대로 저장되어 문자열을 만든다. 이때 남는 배열 요소에는 자동으로 0이 채워진다. 이렇게 char형 배열에 저장된 0을 특별하게 '널 문자'라고 부른다. 널 문자는 문자열의 끝을 표시하는 용도로 쓰인다.
printf 함수가 배열의 크기와 상관없이 초기화된 문자열만 출력하는 것도 널 문자가 있기 때문이다. 널 문자가 나올 때 까지만 출력하도록 만들어졌기 때문! 이러한 규칙은 문자열을 처리하는 모든 함수에 적용된다. scanf 함수도 마찬가지로 사용자가 입력한 문자열 다음에 자동으로 널 문자를 추가하여 문자열의 끝을 표시한다.
따라서 char 형 배열을 선언할 때는 다음의 사항을 주의해야한다.
- 배열의 크기는 최대한 넉넉히 선언한다.
- 배열 요소의 개수는 최소 문자열 길이 + 1이어야 한다. ( 널 문자 )
문자열의 대입
문자열은 저마다 길이가 다르다. 그래서 초기화 된 이후 배열에 새로운 문자열을 저장하려고 한다면 일반 변수처럼 대입 연산자를 사용하는 것은 불가능하다. 이 떄 사용하는 함수가 바로 strcpy() 함수이다.
왜 문자열에는 대입 연산자를 사용할 수 없을까?
char str[100];
str = "apple";
위와 같은 배열의 대입 연산은 불가능하다. 컴파일에서 에러가 발생하게 되는데, 그 이유는 배열명이 포인터이기 때문이다. 배열명은 배열이 할당된 메모리 주소값이므로 숫자이다. 예를들어 포인터가 메모리 100번지라면, 대입 연산자를 활용했을 때 100번지(상수)에 apple을 대입하는 것과 같다. 그러므로 대입 연산자이 왼쪽에는 배열명이 올 수 없다!
그래서 우리는 다음과 같은 함수를 사용하여 배열에 문자열을 대입해야하는데,
strcpy() 함수
char 형 배열에 새로운 문자열을 저장하는 함수로, 저장된 문자열의 길이를 파악하며 그 만큼의 길이만 char 형 배열에 복사한다.
당연히 문자열의 끝에 널 문자를 자동으로 추가해준다.
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[100] = "cat";
char str2[100];
strcpy(str1, "tiger");
strcpy(str2, str1); // str2에 str1을 복사한다.
printf("%s, %s \n, str1, str2);
return 0;
}
strcpy() 함수 사용법
strcpy(저장될 배열명 , 저장할 배열명);
문자열 전용 입출력 함수 gets / puts
scanf 함수는 char 형 배열에 문자열을 입력할 수 있지만, 빈칸이 중간에 있는 경우 빈칸 전까지만 입력한다. 따라서 빈칸을 포함한 문자열 입력 방식이 필요하다. 이때 사용하는 것이 gets 함수이다. 이 함수는 빈칸을 포함하여 한 줄 전체를 문자열로 입력한다.
짝을 이루는 출력함수 puts도 있다.
puts 함수는 문자열을 출력한 후 자동으로 줄을 바꾼다. 그래서 문자열을 출력한 후 바로 이어서 입력하는 것이 불가능하다.
'공부 STUDY > C | C++' 카테고리의 다른 글
[ C ] 주소와 포인터 차이? | 포인터의 크기 | 포인터 자료형 | 포인터 기능 (0) | 2023.01.28 |
---|---|
[ C ] 포인터란? 메모리 주소 | 포인터 연산자( &, *) (0) | 2023.01.28 |
[ C ] 배열 | 배열의 선언과 사용 (0) | 2023.01.28 |
[ C ] 겨울방학동안 C 포인터/ 구조체/ 동적메모리 개념 확실하게 익히기 | 자료구조 학습전 갖추어야할 베이스지식 (0) | 2023.01.28 |
[C] fgetc() 함수의 반환값은 int (0) | 2022.12.03 |