#include <string.h> : 문자열 관련 함수를 포함하는 라이브러리
이 헤더파일에는 C 형식 문자열 (널 종료 문자열) 을 다룰 수 있는 함수들을 포함하고 있다.
함수들
문자
한개의 알파벳 혹은 한글 및 기타 부호 : 작은따옴표(')로 둘러싸서 표시('A')
문자열
문자의 집합인 일련의 문장 : 큰따옴표(")로 둘러싸서 표시한다. ("string")
C언어에서는 문자열을 위한 자료형 X → 문자 배열을 통해 문자열을 저장하여야 함
문자열 저장하는 문자 배열의 마지막에는 \0 (NULL) 문자가 저장된다
NULL문자 : 문자열의 마지막을 나타냄
즉, 문자열을 저장하는 문자 배열의 크기 = 문자열의 길이 + 1
char ch = 'C'; // 문자 선언
// 문자열 선언 1
char str1[] = "java";
// 문자열 선언 2
char str2[] = {'J', 'A', 'V', 'A'};
// 출력
printf("%c %c \n", str1[0]. str2[0]);
C
복사
<stdio.h>의 문자열 다루는 함수들
문자 입력 : getchar()
임시저장소인 buffer를 사용해 문자를 입력받음
enter 키 누르기 이전에 입력된 문자를 버퍼에 저장 후 enter키 만나면 버퍼에 저장된 문자를 읽는다
함수원형 : int getchar(void); 이기 때문에 콘솔창에서 우리가 입력하는 표준 입력들을 int타입으로 하나씩 변환해주는 함수이다.(반환형이 int)(아스키코드(
그러므로 char c = (char)getchar(); , int c = getchar(); 모두 가능
char c1, c2, c3;
printf("문자를 입력하세요 : ");
c1 = getchar();
printf("getchar()을 사용해 입력한 문자는 %c 입니다.\n", c1);
// 문자를 입력하세요 : a
// getchar()을 사용해 입력한 문자는 a 입니다.
C
복사
문자 출력 : putchar()
함수원형 : int putchar(int c);
매개변수로 들어온 문자 c를 표준출력에 문자로 출력해줍니다.
즉, 콘솔창에 'c'를 반환해주는 함수. 매개변수 데이터타입이 int이므로 type casting의해 int로 인식을 한 후 char타입으로 변환해 출력을 해준다(아스키코드)
문자열 입력 : scanf(), gets()
scanf()
•
하나의 문자열을 입력 받음.
•
공백을 만나면 입력 종료.
gets()
함수원형 : char* gets(char* str);
•
한 행의 문자열 입력 받음.
•
들어온 문자열에 '\0'을 붙여줌
•
buffer 이용해 문자열 입력받음.
•
enter키 누르면 버퍼에 저장된 문자열을 입력받는다.(문자열이라고 감지하는 기준이 개행(\n))
•
한 행의 문자열을 입력 받기 위해선 gets()한수의 매개변수로 충분한 공간의 문자 배열을 사용해야 한다
•
표준입력으로 들어온 문자열을 개행한 부분 앞까지 짤라서 char* 타입의 문자열로 저장해주고, 자동으로 문자열 맨 끝에'\0'을 넣어서 문자열을 완성해 줌
최신 visual studio에서는 gets는 사용하지 않게 하고 gets를 오버로드한 gets_s를 사용하라고 권장합니다.
gets의 문제는 버퍼 오버플로우가 날 수 있기 때문에, 그것을 방지 하기 위해서 조금 안전하게 gets_s를 만들어서 제공하는 것 입니다.
char str[5]; gets(str); 에서 "ABCDEFGH"를 입력한다면 버퍼오버플로우 발생(배열 길이보다 더 긴 문자열이 입력됨)
puts()
함수원형 : int puts(const char* str)
•
한 행의 문자열 출력
•
C언어 스타일의 문자열인 char*, char[] 타입을 표준 출력(stdout)으로 보내는 함수입니다.
•
puts 함수가 문자열을 출력을 끝까지 하고나면 개행(\n)도 보내기 때문에 자동적으로 줄이 바뀌게 됩니다.
•
puts 함수의 매개변수로 들어온 문자열 처음부터 문자열의 끝 '\0' 까지의 문자열을 출력합니다.
•
매개변수로 들어온 char* 타입의 문자열의 주소값으로 가서 문자열의 끝 '\0'이 나올때까지의 문자들을 표준출력(output)에 쭉 출력해주다가
•
다 출력한 후에는 친절하게 개행('\0') 까지 넣어주는 함수
char str[100] = "BlockDMask";
puts(str); // 문자열을 표준출력(콘솔창)으로 출력합니다.
C
복사
<string.h>
문자열 다루는 다양한 함수가 정의되어 있는 헤더파일
[string.h에서 정의되는 자료형 size_t]
•
unsigned int 이며, 문자열이나 메모리의 사이즈를 나타낼 때 사용
•
"unsigned int"를 type def unsigned int size_t; 이렇게 size_t 라는 이름으로 정의해 놓은 것
•
32비트 운영체제에서는 "부호없는 32비트 정수"이고, 64비트 운영체제에서는 "부호없는 64비트 정수"
•
unsigned int와 다른 점은 "unsigned int" 또는 "int"는, 64비트 OS라고 해서 꼭 64비트 정수는 아니고 여전히 32비트일 수도 있다는 것.
•
메모리나 문자열 등의 길이를 구할 때에는 "unsigned int" 대신 size_t 라는 형으로 길이가 반환
문자열 비교함수 strcmp()
•
두 문자열을 사전순으로 비교하는 함수
•
두 문자열을 비교할 최대 문자 수 지정 가능
•
int strcmp(const char * str1, const char *str2); : 두 문자열을 앞에서부터 비교해가며
두 문자가 다른 경우 1. 앞의 문자열이 크면 양수, 2. 뒤의 문자열이 크면 음수
두 문자가 같은 경우에는 0을 반환한다.
•
int strcmp(const char * str1, const char * str2, size_t n); : 두 문자열을 앞에서부터 n개의 문자만큼만 비교해가며, 반환하는 수는 위의 경우와 같음
문자열 복사 함수 strcpy()
앞 매개변수 문자열 str1에 뒤 매개변수 문자열 str2를 복사하는 함수
그렇기에 첫 매개변수 str1은 str2가 복사될 수 있는 충분한 공간이 필요하다
•
char *strcpy(char *str1, const char *str2);: str1문자열에 str2문자열(NULL문자 포함)을 복사하고 복사된 문자열 str1을 반환
•
char *strcpy(char *str1, const char *str2, size_t n);: str1문자열에 str2 문자열의 앞에서부터 n개 문자의 복사한 후, 복사된 문자열 str1을 반환.
str2 문자열의 길이보다 n이 클 경우 나머지는 NULL 문자로 채워진다.
문자열 연결 함수 strcat()
하나의 문자열 뒤에 다른 문자열을 추가해 연결하는 함수
함수의 첫번째 매개변수 str1은 추가될 문자열 str2가 저장될 수 있는 충분한 공간을 가지고 있어야 함
•
char *strcat(char *str1, const char *str2); : 문자열 str1에 문자열 str2를 연결해 str1에 저장. 연결된 문자열 str1을 반환
•
char *strcat(char *str1, const char *str2, size_t n);: 문자열 str1에 문자열 str2의 앞에서부터 n개 문자를 연결해 str1에 저장. 연결된 문자열 str1 반환
문자열 분리 함수 strtok()
문자열 str에서 구분자 (delimiter)를 기준으로 문자열을 분리해주는 함수
구분자는 문자열로 표시
각 문자 하나하나가 구분자가 됩니다
첫번째 매개변수 str은 문자열이어야 함.( 문자열 상수 사용 불가)
•
char *strtok(char *str, const char * delimiter);
문자열 str에서 문자열 delimeter을 구성하는 문자들을 기준으로 분리한 문자열을 순서대로 반환하는 함수
문자열 길이 반환하는 함수 strlen()
문자열의 길이에 NULL문자는 포함 X
size_t strlen(const char *str)
문자열 모든 문자 소문자로 변환하여 반환하는 strlwr() 문자열 모든 문자 대문자로 변환하여 반환하는 strupr()
char *strlwr(char *str)
char *strupr(char *str)
여러 분자열 처리하기
문자 포인터 배열 을 이용하면 여러개의 문자열을 처리할 수 있습니다.
char *str[] = {"str1", "str2", "str3"};
•
그러나 이 경우에는 str[0][2]='s'와 같이 문자열 수정은 불가능합니다.
문자의 이차원 배열로도 여러개의 문자열을 처리할 수 있습니다
char ca[][5] = {"str1", "str2", "str3"};
•
이 경우에는 str[0][2]='s'와 같이 문자열 수정이 가능합니다.
•
주의할 점 : 이차원 배열의 열크기는 가장 큰 문자열의 길이보다 1 크게 선언 필요(NULL까지 저장)
char * name[] = {"alex", "jack", "jessica"};
printf("%s %s %s \n", name[0], name[1], name[2]);
// alex jack jessica
C
복사