-
C언어 문자와 문자열, 문자열과 포인터, malloc()Visual Studio/C 기초 2012. 9. 5. 15:23
문자
C는 문자값을 저장하기 위해서 char형을 사용합니다. 문자를 직접 저장하는 방법이 없기 때문에 각각의 문자 코드에 대응하는 숫자 코드가 존재합니다. 이런 숫자 코드를 ASCII (American Standard Code for Information Interchange) 코드 또는 ASCII 문자라고 합니다. 저는 아스키 코드라고 읽습니다. ㅎㅎ 이해하기 쉽게 바로 예제로 알려드리겠습니다.
Tip. 정수형 표현은 %d, 소수형 표현은 %f죠? 문자형 표현은 %c 입니다.
#include <stdio.h>
main(void){
char c1 = 'a';
char c2 = 90;
printf("c1에 입력된 문자는? : %c\n", c1);
printf("c1의 ASCII 문자 숫자 번호는? : %d\n\n",c1);printf("c2에 입력된 문자는? : %c\n", c2);
printf("c2의 ASCII 문자 숫자 번호는? : %d\n\n",c2);
}a에 해당하는 ASCII코드의 숫자는 97임을 알 수 있고 Z문자에 대응하는 ASCII코드의 숫자는 90임을 알 수 있습니다.
char형의 변수에서 허용되는 범위가 127까지이지만 ASCII 코드는 255까지의 범위를 가집니다. 사실 두 부분으로 나누어 지는데, 표준 ASCII 코드는 127까지의 값을 가집니다. 128~255까지의 코드 값은 확장 ASCII 코드로써 외국어 문자나 그래픽 문자와 같은 특수한 형태의 문자를 표현하기 위해 사용됩니다. 확장 ASCII 코드를 표현하기 위해선 unsigned char형을 사용해야 합니다.
문자열
char형 변수는 단 하나의 문자 값만을 저장할 수 있습니다. 예를 들어 scanf로 '나는 잘생겼다' 라는 문자를 받을 경우 '나'라는 글자만 출력하게 됩니다. 그래서 문자형 배열을 사용하는 겁니다.
char형 배열을 선언하면 됩니다.
char c_array[11] // 10자의 글자를 저장할 수 있는 char형 배열입니다.
잠깐! 왜 11칸의 배열을 선언했는데 10개 이하의 글자만 저장할 수 있느냐? 바로 문자열 마지막 배열 칸엔 NULL값이 추가되기 때문입니다.
문자 배열의 초기화는 다음과 같습니다. 제 이름이 한재석이므로 h a n j a e s e o k 로 초기화 해보겠습니다.
char c_array[11] = {'h', 'a', 'n', 'j', 'a', 'e', 's', 'e', 'o', 'k', '\0'}; //이렇게 초기화 합니다. \는 역슬래시 대신 표기한 것입니다.
이렇게 하면 조금 번거롭죠? 이런 방법도 있습니다.
char c_array[]="hanjaeseok";
여기선 NULL 값을 써주진 않지만 암묵적으로 써져있고 생략되어 있습니다.
문자열과 포인터
문자열을 배열에 저장하지 않고 사용하는 방법이 있을까요? 설명해드리겠습니다. 포인터를 사용하면 됩니다.
char *message; //포인터를 char형으로 선언하면 됩니다.
char *message = "Hello world!";
위의 포인터는 어떠한 것도 가리키지 않지만 문자열의 마지막을 표시하는 널 문자를 가지는 문자열 Hello world!를 메모리 내의 특정 영역에 저장하고 포인터 message는 문자열의 첫 번째 문자를 가리키도록 초기화 됩니다. 컴파일러에 의해 자동으로 다뤄지기 때문에 메모리 내에서 문자열이 저장되는 부분에 대해선 신경을 쓰지 않으셔도 됩니다.
그러나 프로그램을 작성할 때 미리 알 수 없는 사용자의 입력 동작이나 다른 동작에 의해 내용이 바뀌는 문자열을 저장할 필요가 있을 때 malloc()함수를 사용합니다. malloc()함수는 필요에 따라 저장 영역을 할당해주는 멋진 함수입니다.
malloc()는 C에서 제공되는 메모리 동적할당(memory allocation) 함수중 하나입니다.
malloc()함수는 size로 지정되는 바이트만큼의 메모리 블록을 할당합니다. 그리고 malloc()함수를 사용하기 위해 stdlib.h를 포함해야 합니다. 어떤 컴파일러에선 다른 헤더 파일을 포함하여야 하지만 stdlib.h를 포함시키는 것이 가장 효율적입니다.
하나의 char 형 변숫값을 저장하는 메모리를 할당하기 위해 malloc()를 사용할 수 있습니다.
char *ptr;
ptr = malloc(1); // 이 문장은 1바이트의 메모리 블록을 할당하고 주소 값을 ptr에 저장합니다.
예를 들어, 99개의 문자를 가지는 문자열과 NULL문자를 포함하여 100개의 문자를 저장하는 영역을 할당하기 원한다고 하면
char *ptr;
ptr =malloc(100);
물론 배열을 사용해서 메모리를 할당한 것 처럼 사용할 수 있습니다.
char ptr[100];
malloc()을 사용하여 A~Z를 표현하는 프로그램을 보여드리겠습니다.
#include <stdio.h>
#include <stdlib.h>main(){
char count, *pnt, *p;
pnt = malloc(35 * sizeof(char)); //sizeof 함수는 문자열의 크기를 상수로 변환해주는 함수입니다.
if(pnt==NULL)
{
puts("메모리 할당 오류입니다.\n");
exit(1);
}
p = pnt;
for(count = 65; count<91 ; count++) //ASCII 의 A는 65입니다.
*p++ = count;
*p = '\0';
puts(pnt); //문자열을 출력하는 함수로서 printf 보다 컴퓨터에 부담이 덜 가지만 정수, 실수를 표현 못하는 것이 단점입니다.}
pnt = malloc(35 * sizeof(char)); 에선 char형의 크기에 35를 곱한 값을 사용해서 malloc()함수를 호출합니다.
결과
키보드에서 문자열을 입력받아 출력하는 방법
간단합니다. scanf 함수를 사용할 경우에 번거롭기 때문에 배열과 gets 함수를 사용해서 간편하게 출력해보겠습니다.
#include <stdio.h>
main(){
char input[81]; //입력받을 수 있는 문자열의 최대 길이는 80입니다.
puts("표시할 문자를 입력하세요 : ");
gets(input);
printf("당신이 입력한 문자열은 : %s\n",input);
}다음에 구조체에 대해 포스팅 하겠습니다.
'Visual Studio > C 기초' 카테고리의 다른 글
C언어 구조체와 배열 (0) 2012.09.06 C언어 구조체의 기본 (2) 2012.09.06 C언어 포인터 연산 (Pointer arithmetic) (0) 2012.09.05 C언어 포인터(pointer) (3) 2012.09.03 C언어 다차원 배열(Array) (0) 2012.09.03