헤더파일 string.h에 선언된 문자열 관련 함수를 설명한다.
size_t = unsigned int 이다. 즉 부호없는 정수이다.
size_t strlen(const char *a);
->전달된 문자열의 길이를 반환하되, 널 문자는 길이에 포함하지 않음
#include <stdio.h>
#include <string.h>
void Remove(char* str) {
int len = strlen(str); //널문자는 길이에 포함하지않음 만약 good가 입력한다고 가정
//g o o d \n 0 이 저장되어있는것인데 , 널길이를 포함하지않기 때문에 5가반환
str[len - 1] = 0; //널문자는 길이에
//str[5-1] = 0; 은 str[4] 즉 인덱스값기준으로 4에 있는 것 \n을 제거하는 것
}
int main(){
char str[100];
printf("문자열 입력 : ");
fgets(str, sizeof(str), stdin);
printf("길이 : %d , 내용 : %s \n", strlen(str), str);
RemoveBSN(str);
printf("길이 : %d , 내용 : %s \n", strlen(str), str);
return 0;
}
===================실행 결과=======================
문자열 입력 : Good morning
길이 : 13, 내용 : Good morning
길이 : 12, 내용 : Good morning
void Remove(char* str) {
int len = strlen(str); //널문자는 길이에 포함하지않음 만약 good가 입력한다고 가정
//g o o d \n 0 이 저장되어있는것인데 , 널길이를 포함하지않기 때문에 5가반환
str[len - 1] = 0; //널문자는 길이에
//str[5-1] = 0; 은 str[4] 즉 인덱스값기준으로 4에 있는 것 \n을 제거하는 것
}
위 코드를 보면 이해가 될것이다. fgets함수가 입력을 받을 때 엔터 키 까지 입력받는 것을
즉 Remove 함수를 호출해 \n 문자를 제거하는 것이다.
첫번째 출력결과는 길이 13을 출력하는데 이는 \n문자를 포함하고 있기에 13을 출력하는 것이다.
그리고 개행도 두번 이루어졌다.
결론 :
strlen 함수는 널문자를 길이에 포함하지 않고 길이 정보를 반환한다.
엔터키의 입력을 strlen함수를 사용해 제거할 수 있다.
문자열을 복사하는 함수
char * strcpy(char *d, const char * s); //배열 s를 배열 d에 복사
char * strncpy(char *d, const char*s, size_t n); //배열 s를 n의 길이만큼 배열 d에 복사
->복사된 문자열의 주소값 반환
strncpy는 복사될 배열의 길이를 넘어서지 않는 범위 내에서 복사를 진행하는 경우에 유용하다.
strncpy로 복사를 할때 주의할 점이있다.
strncpy는 길이정보에 널문자가 포함되지 않기 때문에, 딱 그 길이만큼의 문자만 복사가 된다.
즉 strncpy 함수의 세번째 인자로 배열의 실제 길이보다 하나 작은 값을 전달해서 널문자가 삽입될 공간을 남겨두고 복사를 하고, 배열의 끝에 널 문자를 삽입해야 한다.
strncpy(str3, str1, sizeof(str3)-1);
str3[sizeof(str3)-1] =0; 이런식으로 널문자를 직접 삽입해야 한다.
문자열을 덧붙이는 함수
char *strcat*(char *d, const char *s); //배열 s에 저장된 문자열을 배열 d의 뒤에 덧붙여라
char *strncat*(char *d, const char *s, size_t n); //배열 s에 저장된 문자열을 최대 n의 길이 만큼 배열 d의 뒤에 덧붙여라
->덧붙여진 문자열의 주소 값 반환
또한 배열 s가 덧붙여지기 시작하는 위치는 배열 d의 널값부터이다. 즉 널값을 덮어 씌워 배열 d에 남아있는 널값을 없앤다.
당연히 문자열에는 한개의 널값만 존재해야 한다 .
그리고 d의 배열이 s의 길이를 저장할 수 있을 만큼의 충분한 공간이 남아 있어야 한다.
size_t n에 저장된 길이만큼 덧붙여지는데 , 이 길이에 널문자는 포함이 안된다.
실제로는 널문자가 포함한 상태로 +1개가 덧붙여진다.
문자열을 비교하는 함수
int strcmp(const char *s1, const char * s2); //배열 s1과 s2를 비교해라
int strncmp(const char * s1, constr char *s2, size_t n); 배열 s1과 s2를 비교하되, n의 길이까지만 비교해라
-> 두 문자열의 내용이 같으면 0, 같지 않으면 0이 아닌 값을 반환
s1이 더크면 양수 반환
s2가 더 크면 음수 반환
s1과 s2가 같으면 0을 반환
크고 작음의 기준은 아스키 코드 값을 기준으로 한다.
저장된 문자열중 한글자 찾기를 이함수로 사용하면 유용하다.
<stdlib.h>에 선언된 변환 함수들
int atoi(const char *str); //문자열의 내용을 int형으로 변환
long atol(const char *str); //문자열의 내용을 long형으로 변환
double atof(const char * str); //문자열의 내용을 double형으로 변환
즉 문자열 123을 정수 123으로 변환 하거나 문자열 7.15를 실수7.15로 변환 해야하는 경우에 사용한다.
'휴지통 > C 언어' 카테고리의 다른 글
파일 입출력1 (0) | 2021.02.06 |
---|---|
구조체 (0) | 2021.02.04 |
문자와 문자열 (0) | 2021.02.01 |
함수 포인터, void 포인터 (0) | 2021.01.31 |
다차원 배열과 포인터, 다중 포인터 (0) | 2021.01.30 |