문자 'A'를 저장하고 싶을 때
char grade = 'A';와 같은 문장형식으로 작성하면
이와 같이 저장할 수 있다.
앞에서 배운 배열을 이용하면 문자 여러 개를 문자열로 저장할 수 있지 않을까?
char형 배열은 문자 여러 개를 저장하고 싶을 때 사용한다.
예를 들어, 'Korea'라는 문자를 저장하고 싶다면?
char city[6] = "Korea";이와 같은 형식으로 작성하고,
이런 형태로 저장된다.
char형 1차원 배열을 선언하면서 문자열을 저장할 때는,
배열 선언 시에만 사용 가능한 초기화 방법 두 가지가 있다.
'Semin'이라는 문자열을 선언해보면서 알아보자.
char name[6] = {'S', 'e', 'm', 'i', 'n', '\0'};
이렇게 원소를 구분하여 선언할 수 있다.
이때,
'\0'
이 문자는 널(null)문자로 문자열의 끝을 나타내는 데 사용한다.
만약 끝에 널이 없다면? 결과를 예측할 수 없기 때문에 꼭 원소에 포함 시켜야 한다.
char name[6] = "Semin";
문자열은 이렇게 원소 구분없이 선언해줄 수 있는데,
결과는 같다.
여기서 중요하게 봐야할 부분은 문자열의 길이이다.
문자열은 'Semin'으로 길이는 5인데,
두 가지 방법 모두 '6'으로 선언했다.
즉, 문자열 선언했을 때,
최소 크기 = 문자열 길이 + 1 (널 용)널(null) 문자도 포함했다는 점 잊지말자!
문자열을 출력할 때, 배열명만 사용하면 문자열을 출력할 수 있다.
위에서 선언한 'name'을 출력해보자.
#include <stdio.h> int main() { char name[6] = "Semin"; printf("%s.\n", name); return 0; }
'printf' 부분을 해석하면,
printf("%s.\n", name);
name 배열 시작 위치부터 널 문자를 만날 때까지 출력한다는 의미이다.
배열명 = 배열 시작 주소
문자열을 입력할 때도 배열명만 사용한다.
근데 여기서 재밌는 부분이 있다.
문자열을 입력 받아서 출력하는 프로그램을 작성해보자.
#include <stdio.h> int main() { char name[6] = "Semin"; printf("너 이름이 뭐니"); scanf("%s", name); printf("안녕 %s!", name); return 0; }
scanf 함수 형식이 저게 맞나?
문자열 입력에서는
배열명 = 배열 시작 주소
이기 때문에,
"name" 앞에
&을 붙이나 안 붙이나 상관이 없다.
또한, 기존에
char name[6] = "Semin";선언된 문자열이 있지만,
scanf 함수를 통해 새로 입력 받아서
name 시작 위치부터 널문자를 만날 때까지만 출력하므로
기존 문자열과 관련이 없다!
둘의 차이는 뭘까?
바로 문자열과 문자를 구분했다는 것이다.
char name[6] = "Semin"; printf("%s", name);
char name[6] = "Semin"; printf("%c", name[3]);
쉽죠?
이제 배운 걸 바탕으로 실습해보자
주민등록번호가 010109-3XXXXXX 이라면,
2001년생 남자인 것을 알 수 있다.
즉, '-' 뒤 숫자를 보고 판별하는 것이다.
'-'뒤 번호가 '2'
= 19XX년생 여자
'-'뒤 번호가 '3'
= 20XX년생 남자
'-'뒤 번호가 '4'
= 20XX년생 여자
그럼 한 번 작성해보자.
#include <stdio.h> int main() { char id[15] = ""; printf("주민등록번호는? \n"); scanf("%s", id); if (id[0] == '0' || id[0] == '1' || id[0] == '2') { if (id[7] == '3') printf("20%c%c년생 남자 \n", id[0], id[1]); else if (id[7] == '4') printf("20%c%c년생 여자 \n", id[0], id[1]); } else if (id[0] == '2' && id[1] != '0' || id[1] != '1' || id[1] != '2') { if (id[7] == '1') printf("19%c%c년생 남자 \n", id[0], id[1]); else if (id[7] == '2') printf("19%c%c년생 여자 \n", id[0], id[1]); } return 0; }
휴대폰 번호는 int형 변수에 저장할 수 있을까?
#include <stdio.h> int main() { int hp = 01012345678; printf("번호:%d", hp); return 0; }
왜 안됨?
C 언어에서는 0이 앞에 붙은 숫자는 10진수가 아닌 8진수를 의미한다.
그래서 %d로 출력해보면 10진수보다 작은 값이 출력된다.
이제 한 번 해보자.
#include <stdio.h> int main() { int i; char hp[12] = "01012345678"; printf("연락처: "); for (i=0; i<3; i++) printf("%c", hp[i]); printf("-"); for ( ; i<7; i++) printf("%c", hp[i]); printf("-"); for ( ; i <11; i++) printf("%c", hp[i]); return 0; }
for 반복문으로 구간을 나눠서 출력해주면
잘 나온다.
#include <stdio.h> int main() { int i; char hp[12] = "01012345678"; printf("연락처: "); for (i=0; i<11; i++) { if (i == 3 || i ==7) printf("-"); printf("%c", hp[i]); } return 0; }'-'이 들어가는 3번째, 7번째 자리에만 if문을 써주면
된다.
프로그램의 저장된 hp 전화번호와 입력한 input이 같은지 확인하려면?
두 번호의 일치 여부를 판단하고,
끝 문자까지 같으면 일치
중간에 다른게 있으면 불일치
#include <stdio.h> int main() { int i; char hp[12] = "01012345678", input[12]; printf("휴대폰 번호는?"); scanf("%s", input); for (i=0; i<12; i++) { if (hp[i] != input[i]) break; } if (i==12) printf("인증 성공! \n"); else printf("인증 실패! \n"); return 0; }
중간에 다른 번호가 있으면 break; 을 통해 중단하고, "인증 실패!"를 출력한다.
라이브러리 함수 strcmp를 활용하면 쉽게 작성할 수 있다.
strcmp(문자열1, 문자열2)
-> 두 문자열이 같으면
결과값이 0인 함수
#include <stdio.h> // scanf, printf 함수를 위해 필요한 헤더 파일 #include <string.h> // strcmp 함수를 위해 필요한 헤더 파일 int main() { int i; char hp[12] = "01012345678", input[12]; printf("휴대폰 번호는?"); scanf("%s", input); if (strcmp(hp, input) == 0) printf("인증 성공! \n"); else printf("인증 실패! \n"); return 0; }
strcmp 함수를 사용해줄 때는 꼭 전치리기 함수
#include <string.h>