ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 기초#9 문자열(string)
    Programming 기초/C Language 2023. 4. 13. 17:29

    *문자열(string)

    • 문자열은 “abc”와 같이 큰 따옴표로 표시하고 문자는 ‘a’와 같이 작은 따옴표로 표시한다. “”‘’ 가 없으면 변수의 이름으로 취급된다.
    • ‘\0’은 NULL문자로, 아스키 코드 값이 0인 문자이다.
    • (NULL 문자의 원래 의미는 터미널이나 프린터로 보내지는 NOP(No Operation) 명령어를 의미하였다. NULL 문자는 ‘\0’으로 표현하는데 이것은 아스키 코드에서 값이 0인 코드를 의미하므로 단순히 정수 0으로 쓰기도 한다.)
    • NULL 문자의 필요성 : 컴퓨터는 쓰레기 값 역시 문자로 인식하기 때문에 어디까지가 의미 있는 문자열인지 알지 못한다. 예를 들어 10바이트의 배열을 선언하고 5바이트만 채웠을 때 끝이 지정되어 있지 않으면 나머지 5바이트에는 쓰레기 값이 들어간다고 해도 문자로 인식할 것이다. 따라서 문자열을 저장할 때는 마지막에 NULL 문자인 ‘\0’을 붙여줘야 한다. 문자 배열은 저장하고자 하는 문자열의 크기보다 항상 하나 더 커야 한다.
    • 예를 들어 문자열 "Seoul"을 저장한다면 5개의 문자 저장되고 마지막에 NULL문자인 '\0'가 저장된다.
    S e o u l \0    
    • 변수에 문자를 저장시 str[0] = 'A'로 작은 따옴표를 사용하면 하나의 문자를 뜻하는 아스키 코드로 인식하고, str[0] = "A"로 큰 따옴표를 사용하면 문자열로 인식하여 문자열 끝에 NULL문자가 추가된다.
    • 배열 크기 지정 안하면 컴파일러가 자동으로 문자열에 맞춰 설정.
    • 만약 문자 배열의 크기가 충분하지 않으면 컴파일러는 경고한다. 일부 문자는 저장되지 않으며 NULL 문자도 추가되지 않는다.
    char str[] = "abc";	//배열의 크기는 4가 된다.
    
    char str[4] = "abcdef";
    • 배열 크기가 초기화 문자열보다 크다면 남는 공간은 모두 NULL 문자로 초기화됨.
    • 만약 NULL 문자열로 초기화하려면 두 번째 줄의 문장을 사용.
    char str[6] = "abc";
    
    char str[6] = "";

     

    *문자열의 출력

    형식 제어 문자열을 사용한 출력 : printf(“%s”, str);

    형식 제어 문자열 없이 문자 배열을 전달 : printf(str);

     

    *문자열 상수와 포인터 (데이터 세그먼트와 텍스트 세그먼트의 비교)

    문자열 상수는 프로그램이 사용하는 메모리 영역 중에서 텍스트 세그먼트(text segment)라고 불리는 특수한 메모리 영역에 저장된다. 텍스트 세그먼트는 읽기는 가능하지만, 우리가 변경 할 수 없는 메모리 영역이다.

     

    *문자 입출력 라이브러리

    1.getchar()putchar()<stdio.h>에 들어있다.

    입출력 함수 설명
    int getchar(void) 하나의 문자를 읽어서 반환한다.
    void putchar(int c) 변수 c에 저장된 문자를 출력한다.
    int_getch(void) 하나의 문자를 읽어서 반환한다(버퍼를 사용하지 않음)
    void_putch(int c) 변수 c에 저장된 문자를 출력한다(버퍼를 사용하지 않음)
    scanf(“%c”, &c) 하나의 문자를 읽어서 변수 c에 저장한다.
    printf(“%c”, c) 변수 c에 저장된 문자를 출력한다.
    • 형식 : int getchar(void); int putchar(int c);
    • -getchar() 함수 반환형이 int형인 이유는 입력의 끝을 나타내는 EOF(End of File) 문자를 체크하기 위해서이다.
    • getchar() 함수는 엔터키를 쳐야 입력 문자를 받는데, 버퍼를 사용하기 때문. 사용자가 키보드를 이용하여 문자를 입력하면 이들 문자는 곧바로 프로그램으로 가는 것이 아니라 버퍼라고 불리는 저장 공간으로 간다. 엔터키가 눌러지면 버퍼에 저장되었던 문자들이 프로그램으로 저장된다. 보통 입력이나 출력에 버퍼를 사용하는 것은 다중 사용자 환경에서 컴퓨터를 효율적으로 사용하기 위해서이다.

    2._getch()_putch()<coino.h>에 들어있다. 이 두 개 함수는 ANSI C 표준 라이브러리 함수에 포함되지 않는다. 하지만 많은 컴파일러가 이들 함수를 지원하고 있기 때문에 알아둬야 한다. 이들은 에코(echo)를 하지 않는다. getchar()와 같은 보통의 입출력 함수들은 문자를 입력받으면서 화면에도 문자를 출력하는데_getch()함수는 전혀 화면에 아무것도 나타내지 않는다. 만약_getch()를 사용하는데 에코가 필요하면 _getche()를 사용할 수 있다.

      헤더 파일 버퍼 사용 여부 에코 여부 응답성 문자 수정 여부
    getchar() <stdio.h> 사용함
    (엔터키를 눌러 입력됨)
    에코 줄 단위 가능
    _getch() <conio.h> 사용하지 않음 에코하지 않음 문자 단위 불가능
    _getche() <conio.h> 사용하지 않음 에코 문자 단위 불가능

     

    *문자열 입출력 라이브러리

    입출력 함수 설명
    int scanf(“%s”, s) 문자열을 읽어서 문자 배열 s[]에 저장
    int printf(“%s”, s) 배열 s[]에 저장되어 있는 문자열을 출력한다.
    char*gets(char *s) 한 줄의 문자열을 읽어서 문자 배열 s[]에 저장한다.
    int puts(const char *s) 배열 s[]에 저장되어 있는 한 줄의 문자열을 출력한다.
    • gets()는 표준 입력으로부터 엔터키, 즉 줄바꿈 문자(‘\n’)가 나올 때까지 한 줄의 라인을 문자열로 입력받는다. 문자열에 줄바꿈 문자(‘\n’)는 포함되지 않으며 대신에 자동으로 NULL 문자(‘\0’)을 추가한다.
    • puts()는 문자열을 받아서 화면에 출력하는 함수이다. 이때 문자열의 끝에 있는 NULL 문자(‘\0’)는 줄바꿈 문자(‘\n’)로 변경된다. 만약 출력 작업이 성공적이었으면 음수가 아닌 값이 반환된다. 만약 실패하였으면 EOF이 반환된다.

     

    *문자 처리 라이브러리

    헤더 파일 ctype.h에 들어 있음. 참이면 0이 아닌 값 반환, 거짓이면 0 반환. int형으로 선언 반환값도 int.

    함수 설명
    isalpha(c) c가 영문자인가?(a-z, A-Z)
    isupper(c) c가 대문자인가?(A-Z)
    islower(c) c가 소문자인가?(a-z)
    isdigit(c) c가 숫자인가?(0-9)
    isalnum(c) c가 영문자이나 숫자인가?(a-z, A-z, 0-9)
    isxdigit(c) c16진수의 숫자인가(0-9, A-F, a-f)
    isspace(c) c가 공백 문자인가?(‘’, ‘\n’, ‘\t’, ‘\v’, ‘\r’)
    ispucnt(c) c가 구두점 문자인가?
    isprint(c) c가 출력 가능한 문자인가?
    incntrl(c) c가 제어 문자인가?
    isascii(c) c가 아스키 코드인가?

    문자에 대한 변환. int형 함수이며 반환형도 int형이다.

    함수 설명
    toupper(c) c를 대문자로 바꾼다.
    tolower(c) c를 소문자로 바꾼다.
    toascii(c) c를 아스키 코드로 바꾼다.

     

    *문자열 처리 라이브러리 함수

    문자열 함수들은 string.h에 선언되어 있음.

    함수 설명
    strlen(s) 문자열 s의 길이를 구한다.
    strcpy(s1, s2) s2를 s1에 복사한다.
    strcat(s1, s2) s2를 s1의 끝에 붙여넣는다.
    strcmp(s1, s2) s1과 s2를 비교한다.
    strncpy(s1, s2, n) s2의 최대 n개의 문자를 s1에 복사한다.
    strncat(s1, s2, n) s2의 최대 n개의 문자를 s1의 끝에 붙여 넣는다.
    strncmp(s1, s2, n) 최대 n개의 문자까지 s1s2를 비교한다.
    strchr(s, c) 문자열 s안에서 문자 c를 찾는다.
    strstr(s1, s2) 문자열 s1에서 문자열 s2를 찾는다.
    char *strtok(s, delimit); 문자열 sdelimit를 이용하여 토큰으로 분리한다.
    • 문자열 길이 : 형식 size_t strlen( const char *s); 문자열의 길이를 반환하는데, NULL문자는 제외된다.
    • 문자열 복사 : 형식 char *strcpy( char *dst, const char *src); src를 dst로 복사한다.
    • 형식 char char *strncpy( char *dst, const char *src, size_t n); src를 dst로 n개의 문자만을 복사한다.
    • 문자열 연결 : 형식 char *strcat(char *dst, const char *src); src를 dst에 붙인다. NULL문자 자리부터 붙임
    • 형식 char *strncat(char *dst, const char *src, size_t n); src 문자열 중 최대 n개의 문자만 dst에 연결
    • 문자열 비교 : 형식 char *strcmp(const char *s1, const char *s2); 문자열 s1과 s2를 비교하여 사전적인(lexicographic) 순서에서 s1이 앞에 있으면 음수가 반환되고, 같으면 0이, 뒤에 있으면 양수가 반환된다.
    • 문자 검색 : 형식 char *strchr( const char *str, int c); 문자열 str에서 문자 c를 검색 그 주소를 반환, 못찾으면 NULL값을 반환. strrchr()는 마지막 문자에서 시작하여 문자열의 시작 부분으로 검색한다.
    • 문자열 검색 : 형식 char *strstr(const char *s, const char *sub); 문자열 s 안에서 부분 문자열(substring) sub를 검색하는 함수. 그 위치의 주소를 반환, 못 찾으면 NULL 값을 반환.
    • 문자열 토큰 분리 : 형식 char *strtok(char *s, const char *delimit);
    토큰(token)이란 문법적으로 더 이상 나눌 수 없는 기본적인 언어 요소. 공백 문자로 분리된 단어들. 매개 변수 delimit는 “띄어쓰기”와 같이 호출 첫 번째 토큰에 대한 포인터를 반환. 만약 계속해서 다음 토큰을 읽으려면 s 대신에 NULL을 넣으면 된다. 동시에 분리자로 사용하려면 분리자들을 모아 문자열로 만든다.

     

    *문자열 수치 변환

    sscanf()sprintf()s는 문자열(string)을 의미. sscanf()는 키보드에서 입력받는 대신 문자열에서 입력받음. 또한 sprintf()는 모니터로 출력하는 대신 문자열로 출력. 첫 번째 매개 변수는 항상 문자열이고 나머지 매개 변수는 printf()scanf()와 동일.

    함수 설명
    sscanf(s, ...) 문자열 s로부터 지정된 형식으로 수치를 읽어서 변수에 저장한다.
    sprintf(s, ...) 변수의 값을 형식 지정자에 따라 문자열 형태로 문자 배열 s에 저장한다.

     

    *전용 함수 사용

    간단하게 문자열을 정수나 실수로 변환하는 경우에는 전용 함수를 사용하는 것도 좋음. 헤더파일 <stdlib.h>

    함수 설명
    int atoi(const cjar *str); strint형으로 변환한다.
    double atof(const char *str); strdouble형으로 변환한다.

     

    *문자열의 배열

     

    -> 14년도 교재를 사용하고 있어서.. 현재, 경고 뜨는 라이브러리 함수들이 매우 많다... 

    댓글

Designed by Tistory.