[3주차] 문자열
문자열
C에서 문자열(String)은 Char 배열로 처리.
문자열 끝에는 null 문자가 항상 있어야 하고, 이게 없으면 문자열이 아니라 문자 배열로 인식.
문자열의 표현은 큰따옴표 두개로 하고 문자열 입출력을 위한 서식 문자는 %s임.
scanf("%s", str);
%s
는 문자열의 끝을 알리는 null
이 입력되기 전까지 입력을 받는데, 이는 공백, 개행문자, \t
이 입력되기 전까지만 입/출력을 한다.
null 문자
문자열의 끝에는 항상 문자열의 끝을 알리는 null 문자가 들어가며, 이는 \0
로 표현한다. 또한 null의 아스키 코드는 0 이다.
null 은 값이 널값임을 의미하고 NULL은 포인터가 널값임을 의미하나 사실 같은 것이다.
char str[] = "Hello";
위 코드의 결과로 생성되는 str 배열의 크기는 null문자를 포함하여 6자리가 된다.
null의 아스키코드가 0임을 활용하면 아래와 같이 코드를 짤 수 있다.
for(int *p = ar; *p; p++){...}
*p
가 null이 되면 0, false 이므로 반복을 멈춘다.
문자열 상수
char *str = "hello";
위와 같이 문자열을 선언한 경우, str의 메모리가 수정 불가능한 상태로 제공되어 str을 상수로 사용할 수 있다.
이 경우, []를 통한 일부 수정을 불가하며 str에 새 값을 대입하여 아예 새로운 글자를 넣어야만 편집이 가능하다.
다수의 문자열 저장하기
char *nums = {"zero", "one", "two"}
식으로 저장하면 필요한 문자열만 저장하여 메모리를 아끼고 문자열을 여러게 적절하게 동적으로 저장할 수 있다.
char* pnum[3] = { "zero", "one", "two" };
char** p;
for (p = pnum; p < pnum + 3; p++)
printf("%s\n", *p);
<string.h> 사용하기
#include <string.h>
를 쳐서 string 라이브러리를 사용할 수 있다.
strlen(char *str)
문자열의 길이를 알려준다.
char str[20] = "hello"; //hello\0
printf("leng: %d", strlen(str)); //6
strcpy(char *dest, char *des)
문자열을 다른 문자열로 복사시켜준다.
char str1[6] = "hello";
strcpy(str1, "hi");
>>"hi"
null 문자도 복사하기 때문에 str1
에는 hi\0lo\0
이 들어가게 된다.
할당받은 메모리가 없는 상태에서 값을 넣으려고 시도하면 런타임 오류가 난다.
strcat(char *dest, char *src)
dest 문자열 뒤에 src 문자열을 접합
char a[11] = "hello";
strcat(a,"world");
>>"helloworld"
strncat도 알아놓기
strcmp(char *lhs, char *rhs)
사전 순으로 lhs와 rhs를 비교하여 문자열 lhs < rhs이면 음수, 같으면 0, lhs > rhs이면 양수 반환
char a[11] = "HelloWorld";
char b[3] = "Hi";
strcmp(a,b);
>>1
문자열을 수로 형변환
아래 함수들은 <stdlib.h>
에 선언되어 있다.
printf("%d\n", atoi("123") );
printf("%ld\n", atol("-123") );
printf("%f\n", atof("123.45") );
문자열 및 문자 입출력
printf와 scanf는 다양한 기능을 가진 범용 입출력 함수로 크기가 크고 속도가 느리다.
문자열과 문자에 특화된 입출력 함수로 아래가 있다.
문자열 : puts, gets (gets_s, fputs)
문자 : putchar, getchar
int puts(char *str)
문자열을 출력하고 마지막에 줄바꿈 문자 \n
를 출력, 반환값은 성공시 0, 실패시 EOF.
char* gets(char *str)
문자열을 엔터 입력때까지 입력받고 엔터가 입력되면 이는 저장하지 않고 \0
을 문자열 뒤에 삽입.
메모리에 값을 직접 삽입하므로 보안상 취약
gets_s
라는 보안 강화판 함수 존재.fgets
라는 대안도 있다.
'학부 수업 > C프로그래밍' 카테고리의 다른 글
[6주차] 연산자 함수, 자료형 심화 (0) | 2020.04.10 |
---|---|
[5주차] 동적 할당 (0) | 2020.04.10 |
[4주차] 구조체 (0) | 2020.04.10 |
[2주차] 포인터 개요 및 복습 (0) | 2020.04.10 |
세종대학교 고급 C 프로그래밍 강의노트 (2) | 2020.04.10 |
댓글
이 글 공유하기
다른 글
-
[5주차] 동적 할당
[5주차] 동적 할당
2020.04.10 -
[4주차] 구조체
[4주차] 구조체
2020.04.10 -
[2주차] 포인터 개요 및 복습
[2주차] 포인터 개요 및 복습
2020.04.10 -
세종대학교 고급 C 프로그래밍 강의노트
세종대학교 고급 C 프로그래밍 강의노트
2020.04.10