배열을 이용한 문자열에 대해서 알아보겠습니다.
C언어는 문자열 데이터형이 없습니다.
따라서 문자형 배열을 선언해서 문자열 형식을 구성합니다.
abc 라는 문자열을 만들려고 하면,
char name[4] = { 'a', 'b', 'c', '\0' }; |
일반적인 배열이라 한다면 이런 식으로 선언을 하게 됩니다.
마지막의 인덱스로 들어가는 \0 (null) 이 들어가게 됩니다.
이유는 문자열의 끝났다는 것을 컴퓨터에게 알려주기 위함입니다.
따라서 문자열을 사용할 때에는 \0 (null) 이 들어갈 자리까지 인덱스 값을 하나 늘려서 선언해야 합니다.
또다른 문자열 만드는 방법으로는
char name[4] = "abc"; |
이 있습니다. 이는 \0 (null) 값을 넣어줄 필요(컴퓨터가 알아서 해줌)가 없기 때문에 편리한 방법입니다.
char str[10] = "C-Program"; for (int i = 0; i < 10; i++) { printf("str[%d] ==> %c\n", i, str[i]); } |
C-program 은 총 9자지만 \0(null) 값이 들어갈 자리까지 생각해서 배열의 길이를 10으로 해서 선언합니다.
배열 str의 요소를 출력해보면 10번째 값이 안나오는 것을 볼 수 있습니다.
이유는 그 자리에 null 값이 들어가 있기 때문입니다.
이제 문자열을 처리하는 함수에 대해서 알아보겠습니다.
#include <string.h> |
문자열을 처리하는 함수를 사용할 때에는 string.h 라는 헤더파일을 꼭 포함시켜줘야 합니다.
string 헤더파일에 문자열을 처리하는 함수에 관한 것들이 들어있기 때문입니다.
strlen(배열이름) |
문자열의 길이를 측정하는 함수입니다.
char str[] = "ABC"; int len; len = strlen(str); printf("문자열의 길이값은 %d\n", len); |
배열 str의 문자열의 길이가 정상적으로 출력되는 것을 알 수 있습니다.
strcpy(배열이름, "문자열") |
문자열을 복사하는 함수입니다
char str[5]; strcpy(str, "ABCD"); printf("문자열 str의 내용은 %s입니다.\n", str); |
strcpy() 함수를 이용하여 비어있는 배열 str에 ABCD를 넣어준 것을 확인할 수 있습니다.
ABCD 4글자를 넣으려면 null자리까지 생각해서 배열의 크기를 5로 선언해야합니다.
strcat(배열이름, "문자열") |
문자열을 이어주는 함수입니다.
char str[7] = "ABC"; strcat(str, "DEF"); printf("이어진 두 문자열의 결과는 ==> %s\n", str); |
기존 배열 str의 인덱스 값 A, B, C에 이어서 D, E, F까지 정상적으로 잘 출력되는 것을 알 수 있습니다.
이 과정에서 기존에 { 'A','B','C','\0' }으로 구성되어있던 str이
{ 'A','B','C','D','E','F','\0' }으로 바뀌게 됩니다 (null값은 자동적으로 맨 끝으로 이동)
strcmp(배열이름, 배열이름) |
두 문자열을 비교하는 함수입니다.
두 문자열이 같으면 0, 다르면 그 이외의 값을 반환하는 함수입니다.
char str1[] = "ABC"; char str2[] = "ABc"; int result; result = strcmp(str1, str2); printf("두 문자열 비교 결과는 ==> %d\n", result); |
배열 str1과 str2의 문자열이 다르기 때문에 비교결과에 0이 아닌 다른 값이 나오는걸 확인할 수 있습니다.
이어서 gets() 함수와 scanf() 함수의 차이점에 대해서 알아보겠습니다.
예전 글에서 scanf() 함수는 사용자가 값을 지정하게 만들어주는 함수라고 설명했습니다.
이번에 설명하는 gets() 함수 또한 비슷한 역할을 수행합니다.
다만 데이터 형식을 지정해주어 유동적으로 값을 받을 수 있는 scanf() 함수와 달리
gets() 함수는 문자열만 받을 수 있습니다.
gets(배열이름) |
gets 함수의 사용 방법입니다. 바로 scanf() 함수와의 차이점을 보겠습니다.
char str1[20]; char str2[20]; printf("첫 번째 문장을 입력해주세요 : "); gets(str1); printf("두 번째 문장을 입력해주세요 : "); scanf("%s", str2); printf("gets로 입력받은 문장은 : %s\n", str1); printf("scanf로 입력받은 문장은 : %s\n", str2); |
위의 소스에 띄어쓰기가 들어가는 C program 이라는 값을 입력해보겠습니다.
gets()로 입력받은 값은 온전히 출력되었지만
scanf() 로 받은 값은 온전히 출력되지 않고
C 까지만 출력된 것을 알 수 있습니다.
여기서 차이점이 드러나게 됩니다.
scanf() 함수는 공백이 정보의 끝으로 인식을 합니다
띄어쓰기를 하게 되면 문자열이 끝났다고 인식을 해 공백 뒤로는 잘라버립니다.
따라서 gets() 함수는 공백이 있는 문자열을 받을 시에,
scanf() 함수는 공백이 없는 문자열을 받을 시에 사용합니다.
위의 정보들로 예제를 내보겠습니다.
여러분들도 한 번 풀어보시기 바랍니다.
문제 > scanf()를 이용하여 문자열을 입력 받는다. 입력받은 문자열을 역으로 출력하는 프로그램을 작성하시오. ex) 문자열 입력 : Program 역으로 출력 : margorP |
scanf() 함수로 문자열을 입력 받은 뒤에 입력받은 문자열을 역으로 출력하는 소스를 짜는 문제입니다.
char str1[20]; char str2[20]; int iend; printf("문자열 입력 : "); scanf("%s", str1); iend = strlen(str1); for (int i = 0; i < iend; i++) { str2[i] = str1[ iend - (i + 1) ]; //str1을 역으로 출력해야하므로 str2[0] == str[3] } str2[iend] = '\0'; // 입력받은 문자열이 abc라고 가정했을 시, str2는 { 'a','b','c' } 상태이다. // 문자열의 마지막을 알려주는 null값(\0)이 들어가 있지 않음으로 따로 넣어주어야 한다. printf("역으로 출력 : %s\n", str2); |
해설입니다.
'C 언어' 카테고리의 다른 글
C 언어 8일차 : 파일 입출력과 함수의 개념 (0) | 2022.12.29 |
---|---|
C 언어 7일차 : 동적 메모리 할당과 2차원 배열 (0) | 2022.12.28 |
C 언어 5일차 : 배열의 주소와 포인터 (0) | 2022.12.24 |
C 언어 4일차 : for/while문, 주소/ 배열의 개념 (0) | 2022.12.22 |
C 언어 3일차 : 증감 / 관계 / 논리 연산자와 if문 (0) | 2022.12.22 |
댓글