본문 바로가기
C C++/C C++ 유용한 알고리즘 기법

C언어 char형과 char*형 차이, %s, %c의 차이

by Go! Jake 2022. 7. 3.

오늘은 알고리즘 문제를 풀다 보니 char형과 char*형, %s와 %c 서식 차이에 대해 깊게 알 필요가 있어 아래와 같이 정리하려고 한다.

char형과 char*형 차이

char형은 문자로 하나의 문자를 담을 수 있다. 다만 char a[10];과 같이 배열로 선언할 수 있다.

char*형은 포인터를 통해 문자을 가리킬 수 있다.

 

char*형은 예를 들어 char* a = "Hello World"라고 선언하는 경우, 메모리에 저장된 Hello World의 첫 'H'가 담긴 첫 주소값을 가리키고 있게 된다.

 

%s와 %c의 차이

%s: char* 형을 필요로 한다. 즉, 문자열 포인터가 입력으로 들어가야 한다. 출력할 때는 지정된 주소부터 \0(NULL)이 나올 때까지 출력한다.

%c: char형을 필요로 한다.

 

char형과 char*형, %s와 %c로 문자열 입력/출력하기

우선 입력 오류 예시 하나를 보자.

char* a;
scanf("%s",a);

위와 같은 형태로 구성하면 오류가 난다. 왜? %s는 char*형을 넣으면 된다고 했는 데?

실제로는 scanf는 쓰기 함수인 데 반 해, 문자열 메모리(문자열 리터럴의 주소 포함)는 읽기 전용이기 때문에 쓸 수가 없다. 그래서 오류가 발생한다.

 

쉬운 방법으로 char 배열 형태로 문자열을 입력 받을 수 있다. 이는 문자열 리터럴을 포인터에 할당하는 위 방식과는 다르게 배열에 하나하나 할당하기 때문에 가능하다.

 

char 배열을 통한 입력

#include <stdio.h>
#include <string.h>

int main(){
	
	char a[10];
	scanf("%s",a);
	printf("%s",a);
	
    return 0;
}

HELLO 출력
HELLO 출력 결과

동적 메모리 할당을 이용한 입력

그렇다면 char* 형태로는 scanf를 절대 못 쓰는 것인가? 그건 아니다. 동적 메모리 할당을 미리 하면 가능하다. 동적 메모리로 '쓰기'할 메모리를 미리 할당하는 경우 가능하다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
	
	char* a = malloc(sizeof(char)*10);
	scanf("%s",a);
	printf("%s",a);
	
	free(a);
    return 0;
}

HELLO 출력 결과 - 2
HELLO 출력 결과 - 2

 

마지막으로, 출력할 때 char*를 통해 가리키는 문자열이 있다면, 이를 인덱스로 접근 가능하다. 아래 예시를 보자.

char*형 문자열 - 인덱스로 접근하기

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
	char* a = "HELLO";
	
	printf("%c", a[0]);
	printf("%c", a[1]);
	printf("%c", a[4]);	
	
    return 0;
}

인덱스로 접근 결과
인덱스로 접근 결과

char*형 a 변수가 가리키는 "HELLO"에 대해 배열로도 접근 가능하다. 해당 값에 접근할 때 필요한 방식이다.

댓글