기초 - 문자

임재현·2021년 4월 26일
0

C

목록 보기
7/10

컴퓨터 공학 전공 필수 올인원 패키지 Onlne. - C. 10.문자

문자열에서 사용하는 gets_s()나 다른 문자열 함수들의 경우, C11이라는 C언어 표준에서 사용할 수 있는데, 이게 널리 구현된 표준도 아니고, 주로 microsoft Visual Studio에서 주로 쓰이는 것 같다. mac os의 경우 사용할 수 없는 걸로 보인다. 나같은 경우 (현재)C언어가 그렇게 급한게 아니기 때문에, 정리만 하고 넘어가겠다.

문자와 버퍼

  • 문자열을 처리할 때 버퍼의 개념이 많이 사용된다.
  • 버퍼(Buffer)란 임시적으로 특정한 데이터를 저장하기 위한 목적으로 사용된다.
  • C프로그램은 기본적으로 사용자가 의도하지 않아도 자동으로 버퍼를 이용해 입출력을 처리한다.

입력 버퍼로 인해 흔히 발생하는 오류

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a;
    char c;
    scanf("%d", &a);
    printf("%d\n", a);
    scanf("%c", &c);
    printf("%c\n",c);
    return 0;
}

컴퓨터는 줄바꿈이나 공백등도 전부 아스키코드로 관리를 하고 있는데, 숫자를 입력하고 엔터를 누르게 되면, 그 숫자 값은 a에 들어가고, 바로 뒤에오는 공백, 바로 그 줄바꿈 자체 엔터라는 문자로 인식을 해버려서 문자로 입력을 받아버린다. 즉 a에는 입력한 숫자가 들어가지만 c에는 줄바꿈이 문자로 인식이 되어버린다. 이때는 남아있는 입력버퍼를 지워줘야 한다.

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a;
    char c;
    scanf("%d", &a);
    printf("%d\n",a);
    int temp;
    // 한 자씩 받아서 파일의 끝이거나(EOF) 개행문자를(여기서는 \n) 만나면 입력을 멈추므로 항상 입력버퍼를 비운다.
    while((temp = getchar()) != EOF && temp != '\n'){}
    scanf("%c", &c);
    printf("%c\n",c);
    return 0;
}

문자열

  • 문자열은 말 그대로 문자들의 배열이다.
  • 문자열은 컴퓨터 메모리 구조상에서 마지막에 널(NULL)값을 포함한다.(11번째,\0부분)
  • 널(NULL)값은 문자열의 끝읅 알리는 목적으로 사용된다.
  • pirntf()함수를 실행하면 컴퓨터는 내부적으로 NULL을 만날 때까지 출력한다.

문자열과 포인터

  • 문자열 형태로 포인터를 사용하면 포인터에 특정한 문자열의 주소를 넣게 된다.
    다음의 코드는 "Hello World"문자열을 읽기 전용으로 메모리 공간에 넣은 뒤에 그 위치를 처리한다. 이러한 문자열을 '문자열 리터럴'이라고 말한다. 이는 컴파일러가 알아서 메모리 주소를 결정한다.
#include <stdio.h>

int main(int argc, const char * argv[]) {
    char *a = "Hello World";
    printf("%s\n", a);
    return 0;
}

또한, 배열과 포인터는 치환이 가능하니깐 포인터로 문자열을 선언했다고 하더라도 기존의 배열처럼 처리할 수 있다.

#include <stdio.h>

int main(int argc, const char * argv[]) {
    char *a = "Hello World";
    printf("%s\n", a);
    printf("%c\n",a[1]);
    printf("%c\n",a[4]);
    printf("%c\n",a[8]);
    return 0;
}

문자열 입출력 함수

  • 문자열 입출력을 수행한다. scanf()함수는 공백을 만날 때까지 입력받지만 gets()함수는 공백까지 포함하여 한 줄을 입력받는다.
#include <stdio.h>

int main(int argc, const char * argv[]) {
    char a[100];
    gets(a);
    printf("%s\n", a);
    return 0;
}

C11표준부터는 버퍼의 크기를 철저히 지키는 gets_s()함수가 추가되었다.

  • gets_s()를 이용하는 경우 범위를 넘으면 그 즉시 런타임(Runtime)오류가 발생하게 된다.
profile
임재현입니다.

0개의 댓글