without haste but without rest
[C] 문자열 관련 함수 본문
Reference - C언어 코딩도장
1. strlen( ) - String length
#include <stdio.h>
#include <string.h>
int main() {
char* s1 = "Hello";
char s2[10] = "Hello";
printf("%d\n", strlen(s1));
printf("%d\n", strlen(s2));
return 0;
}
s1은 포인터 형태로 문자열을 저장했고, s2는 배열 형태로 문자열을 저장했다. 그런데 두 문자열의 길이를 출력하면 둘다 5가 출력된다. 배열로 저장한 경우 남은 배열이 모두 NULL값이 들어가지만 strlen 함수는 NULL값을 계산하지 않는다.
2. strcmp( ) - String Compare
strcmp 함수는 문자열을 매개변수로 받아서 같은지 비교하는 함수다. 동일하면 0을 리턴한다. 첫번째 값이 크면 -1, 두번째 값이 크면 1을 리턴한다.
#include <stdio.h>
#include <string.h>
int main() {
char* s1 = "Hello";
char s2[10] = "Hello";
int ret = strcmp(s1, s2);
printf("%d\n", ret);
return 0;
}
3. strcpy( ) - String Copy
문자열은 다른 배열이나 포인터(메모리)로 복사할 수 있다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char s1[10] = "Hello";
char s2[10];
strcpy(s2, s1); // strcpy(입력, 복사할 소스)
printf("%s\n", s2);
return 0;
}
문자열 포인터를 복사하면 에러가 난다.
char* s2가 읽기 전용 메모리기 때문에 문자열을 복사할 수가 없다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char* s1 = "Hello";
char* s2 ="";
strcpy(s2, s1);
printf("%s\n", s2);
return 0;
}
문자열 포인터에 문자열을 복사하려면 malloc 함수로 메모리를 할당하고 복사해야 한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char* s1 = "Hello";
char* s2 = malloc(sizeof(char) * 10);
strcpy(s2, s1);
printf("%s\n", s2);
return 0;
}
4. strcat( ) - String Concatenate
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char s1[10] = "world";
char s2[20] = "Hello";
strcat(s2, s1);
printf("%s\n", s2); // 첫번째 파라미터에 두번째 값을 붙인다.
return 0;
}
*strcat 함수도 문자열 포인터를 사용하려면 malloc 함수를 사용해서 메모리 크기를 동적으로 할당해주어야 한다.
5. strchr( ) - String Character
왼쪽에서부터 매개변수로 받은 문자를 검색한다.
오른쪽에서 부터 검색하고자 하는 경우 strrchr 함수를 사용한다.
#include <stdio.h>
#include <string.h>
int main() {
char s1[30] = "Hello, Wolrd!";
char* ptr = strchr(s1, 'o');
while (ptr != NULL) {
printf("%s\n", ptr);
ptr = strchr(ptr + 1, 'o');
}
return 0;
}
* ptr = strchr(ptr + 1, 'o') 코드에서 포인터 ptr + 1 이므로 printf 문 이후 "ello, World!" 가 된다.
6. strstr( ) - String find String
문자열 검색
#include <stdio.h>
#include <string.h>
int main() {
char s1[30] = "Hello, Wolrd!";
char* ptr = strchr(s1, 'llo');
printf("%s\n", ptr);
return 0;
}
* char* ptr은 llo로 시작하는 문자열을 검색하고 포인터로 반환한다.
*7. strtok( ) - String Tokenize
매개변수로 받은 값을 기준으로 문자열을 토큰화 한다.
아래 코드에서는 공백을 기준으로 s1 배열을 토큰화 했다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char* s1 = malloc(sizeof(char) * 30);
strcpy(s1, "Hello, C World!");
char* ptr = strtok(s1, " ");
while (ptr != NULL) {
printf("%s\n", ptr);
ptr = strtok(NULL, " ");
}
free(s1)
return 0;
}
* while 문 안의 strktok(NULL, " ") -> NULL을 넣었을 때 직전 strtok 함수에서 자른 문자열 다음에서부터 시작한다.
* C언어는 문자열 끝이 항상 NULL로 끝난다.
문자열 포인터를 자르려면 문자열 포인터에 리터럴을 할당하는 대신 메모리를 동적으로 할당해주어야 한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char* s1 = malloc(sizeof(char) * 30);
strcpy(s1, "Hello, C World!");
char* ptr = strtok(s1, " ");
while (ptr != NULL) {
printf("%s\n", ptr);
ptr = strtok(NULL, " ");
}
free(s1);
return 0;
}
** 포인터의 읽기 전용과 리터럴에 대한 이해가 더 필요하다.
8. atoi( ) - ASCII String to Integer
문자 -> 정수 = atoi
문자 -> 실수 = atof (ASCII String to Float)
#include <stdio.h>
#include <string.h>
int main() {
char* s1 = "283";
int num;
num = atoi(s1);
printf("%d\n", num);
return 0;
}
* 실패시 0 리턴
'ProgrammingLanguage > C' 카테고리의 다른 글
[C] 공용체 (0) | 2020.02.29 |
---|---|
[C] 구조체 (0) | 2020.02.27 |
[C] sprintf / 버퍼 (0) | 2020.02.26 |
[C] 포인터 (0) | 2020.02.26 |
[C] 데이터 입출력 (0) | 2020.02.26 |