오늘은 알고리즘 문제를 풀다 보니 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;
}
동적 메모리 할당을 이용한 입력
그렇다면 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;
}
마지막으로, 출력할 때 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"에 대해 배열로도 접근 가능하다. 해당 값에 접근할 때 필요한 방식이다.
'C C++ > C C++ 유용한 알고리즘 기법' 카테고리의 다른 글
[C/C++] 정수 자릿수 세기 (0) | 2022.07.16 |
---|---|
[C/C++] 소문자-대문자 변환, 대문자-소문자 변환 (0) | 2022.07.10 |
[C/C++] 입력 받은 숫자 특정 자릿수 접근하기 (0) | 2022.07.09 |
[C/C++] 최솟값 최댓값 찾기 (0) | 2022.07.09 |
C언어 여러 좌표 입력받아 출력하기 (0) | 2022.06.24 |
댓글