본문 바로가기

primer plus

[c primer plus] chapter11 문자열과 문자열 함수

문자열(character string)

널 문자 (\0) 로 끝나는 char형 배열

 

배열과 포인터의 차이

char heart[] 

char *head

배열 이름 heart 는 상수

포인터 head 는 변수

head와 heart를 일치시키려고 할 때

head = heart; (o)

heart = head; (x)

 

문자열 입력

읽을 문자열을 저장하기 위한 공간을 할당해야한다.

 

char words[STRLEN];

 

gets()

개행 문자에 도달할 때까지 한 줄을 전부 읽고, 개행 문자를 제거하고 c 문자열을 만들기 위해 널 문자(\0)를 추가하여 남은 문자를 저장한다.

gets(words);

 

fgets()

파일 입출력

읽을 문자들의 최대 개수를 지정함으로써 두 번째 전달인자를 취할 떄 생길 수 있는 오버플로 문제를 해결

최대 개수를 지정하기 위해 두 번째 전달인자로 사용한다.

전달인자가 n이라면 n-1개까지 문자를 읽거나 개행 문자가 나올 때까지 읽는다.

fgets(words, STRLEN, stdin);

fgets(words, stdout)

 

gets_s()

개행을 읽는 경우 개행 문자를 저장하는 대신 버린다.

c라이브러리의 선택적 확장이기 때문에 입력이 예상을 밋나갈 경우, fgets() 보다 덜 편리하고 유연하지 못하다.

gets_s(words, STRLEN)

 

s_gets()

용량을 초과하는 입력을 만나도 표시가 나지 않는다.

char * s_gets(char * st, int n){

                  :

         f_gets(st, n, stdin);

                  :

}

 

scanf()

단어 입력 함수

화이트스페이스 문자(스페이스, 탭, 개행)까지 읽는다.

 

문자열 출력

 

puts()

문자열을 출력할 때 자동으로 개행을 추가해서 각 문자열은 한 라인씩 차지하고 있다.

 

 

fputs()

출력할 타깃 파일을 지정하기 위해 두 번째 전달인자를 사용한다.

출력에 개행을 자동으로 추가하지 않는다.

 

printf()

문자열 주소를 전달인자로 사용한다.

 

문자열 함수

strlen()

문자열의 길이

 

strcat()

문자열 결합

두 번째 문자열의 복사본이 첫 번째 문자열의 뒤에 덧붙고 결합된 문자열이 새로운 첫 번째 문자열이 된다.

두 번째 문자열은 바뀌지 않는다.

 

strncat()

strncat(bugs, addon, 13)

addon문자열의 내용을 bugs에 추가한다.

문자 개수가 13개에 도달하거나 널 문자를 만나면 멈춘다.

 

strcmp()

문자열과 비교

<string.h>에서 선언한다.

리턴값

첫 번째 문자열이 두 번째 문자열보다 알파벳 순서로 앞에 오면 음수

("A", "B")  -1

("Z". "a")  -1

뒤에 오면 양수

("B", "A")  1

같으면 0

("A", "A") 0

 

apple과 apples를 비교할때

문자 s와 널 문자를 배교해야한다

널 문자는 ASCII 시퀀스에서 첫 번째 문자이기 때문에, 양수를 리턴한다.

 

strncmp()

대응하는 두 문자가 일치하지 않는 문자 쌍을 찾을 때까지 문자열들을 비교한다.

 

strcpy()

문자열 복사

strcpy(qwords[i], temp)

두 번째 전달인자(temp)가 가리키는 문자열이 첫 번째 전달인자(qwords[i])가 가리키는 배열로 복사된다.

복사본을 타깃(target)이라고 하고, 원래의 문자열을 소스(source)라고 한다.

타깃 문자열은 왼쪽, 소스 문자열은 오른쪽

char *형이다

첫 번째 전달인자의 값 문자의 주소를 리턴한다.

 

strncpy()

더 안전하게 문자열을 복사한다

복사할 최대문자개수를 지정하는 세 번째 전달인자를 사용한다.

 

strintf()

string.h와 stdio.h에 선언되어 있다.

printf()와 비슷하다

여러항목들을 하나의 문자열로 결합하는 방법을 제공한다.

첫 번째 전달인자는 타깃 문자열의 주소이다.

나머지 전달인자들은 printf()와 동일하다.

포맷 문자열이 먼저 나오고, 출력할 항목들의 리스트가 뒤따른다.

 

문자열 정렬하기

선택 정렬(selection sort)

전체 배열을 스캔하여 가장 큰 수를 찾고 첫번째 원소와 바꾼다.

나머지 배열을 스캔하여 가장 큰수를 찾아서 두번째 원소와 바꾼다.

    : 

 

 

문자열을 수로 변환하기

수를 문자열로 저장한다는 것은 수치문자(digit character)로 저장한다.

213은 '2', '1' ,'3', '\0' 으로 저장될 수 있다.

 

atoi()

stdlib.h 헤더 파일에 선언되어 있다.

정수 부분이 아닌 것을 만날 때까지 그 앞의 문자들만 변환한다.

 

atof()

문자열을 double형 값으로 변환한다.

 

atol()

문자열을 long형 값으로 변환한다.

 

strtol()

문자열을 long형으로 변환한다.

 

stroul()

문자열을 unsigned long형으로 변환한다.

 

strtod()

문자열을 double형으로 변환한다.

 

strtol() 과 stroul()은 진수의 기수(number base)을 지정하는 것도 허용한다.