[C] 문자를 저장하고 싶어요.

장세민·2022년 7월 30일
0

📝 TIL

목록 보기
13/40

문자와 문자열

char형 변수

문자 'A'를 저장하고 싶을 때

char grade = 'A';
와 같은 문장형식으로 작성하면

이와 같이 저장할 수 있다.

앞에서 배운 배열을 이용하면 문자 여러 개를 문자열로 저장할 수 있지 않을까?

char형 배열

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;
}

Hi

'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년생 남자인 것을 알 수 있다.

즉, '-' 뒤 숫자를 보고 판별하는 것이다.

  • '-' 뒤 번호가 '1'
    = 19XX년생 남자
  • '-'뒤 번호가 '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진수보다 작은 값이 출력된다.

이제 한 번 해보자.

  • 방법 1
    #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 반복문으로 구간을 나눠서 출력해주면

잘 나온다.

  • 방법 2
    #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이 같은지 확인하려면?

두 번호의 일치 여부를 판단하고,
끝 문자까지 같으면 일치
중간에 다른게 있으면 불일치

  • 방법 1
    #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; 을 통해 중단하고, "인증 실패!"를 출력한다.

👍

  • 방법 2

라이브러리 함수 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>

선언을 해줘야 한다는 점 잊지 말자!

profile
분석하는 남자 💻

0개의 댓글