프롤로그
ELITE HACKER Bootcamp 3rd 4주차 수업 공부 내용
aws 우분투 서버 하나 파서 연습
string.h 헤더
string.h 헤더
C언어에서 문자열을 다루는 몇몇 함수들은 이미 string.h 헤더 안에 저장되어 있다. 이 함수들을 사용하면 문자열 관련하여 어제 작성했던 코드들 매우 쉽게...원하는 대로 사용할 수 있다.
2024.11.23 - [KnockOn] - [KnockOn] Linux/Ubuntu C언어 문자열
여기 마지막 도전 부분에 60줄씩 코드 짰던 거 6줄 이내로 해결이 가능하다는 거다...
strlen
문자열 길이를 계산하는 함수이다.
size_t strlen(const char *str);
어떻게 사용하냐?
#include <stdio.h>
#include <string.h>
int main(){
char* str = "Hello World";
size_t len = strlen(str);
printf("%s의 길이는 %zu입니다\n", str, len);
}
strlen(문자열) 하면 길이가 출력되는 것을 확인할 수 있다.
그리고 strlen의 반환값은 size_t 인 부호 없는 정수값이다. size_t 는 메모리의 크기를 나타내는 타입으로 배열 크기나 문자열 길이를 다룰 때 표준적으로 사용된다. 그래서 플랫폼 독립적으로 사용이 가능하다.
길이를 출력할 때는 %zu 포맷스트링을 사용하면 된다.
strcpy
문자열 복사하는 함수이다.
char *strcpy(char *dest, const char *src);
포인터, 배열 모두 복사가 가능하다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char* str = "Hello World";
size_t len = strlen(str);
char* str2 = malloc(len + 1);
strcpy(str2, str);
printf("%s\n", str2);
char str3[30];
strcpy(str3, str);
printf("%s\n", str3);
}
strcpy(복사할 곳, 복사할 것) 이렇게 사용하면 된다.
strncpy
아까처럼 문자열 복사하는 건 맞는데, n개 만큼 복사한다고 해서 strncpy이다.
char *strncpy(char *dest, const char *src, size_t n);
#strncpy(복사할 곳, 복사할 것, 개수)
이렇게 사용하는 건데,
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char* str = "Hello World";
size_t len = strlen(str);
char str2[30];
strncpy(str2, str, 5);
str2[5] = '\0';
printf("%s\n", str2);
}
이렇게 개수만 적어주면 된다.
다만 주의해야할 것은, \0는 복사가 되지 않기 때문에 수동으로 \0을 입력해야 한다.
strcat
문자열 연결하는 명령어이다. 연결을 할 때는 앞에거 뒤에 뒤에거를 연결하기 때문에 앞에거의 공간이 충분히 커야한다.
char *strcat(char *dest, const char *src);
#strcat(앞에 거, 뒤에 거)
어떻게 쓰는가?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char str1[30] = "hello";
char str2[] = " world";
char* str3 = " Welcome";
strcat(str1, str2);
strcat(str1, str3);
printf("%s\n", str1);
}
사용법 이렇게 된다. 앞에 거의 공간이 충분히 있지 않으면 터진다.
strncat
아까랑 똑같다. 두 문자열을 연결하는데, 이제 n개의 개수가 들어간거다.
char *strncat(char *dest, const char *src, size_t n);
#strncat(앞에 거, 뒤에 거, 개수)
예시 코드를 보면
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char str1[30] = "hello";
char str2[] = " world";
char* str3 = " Welcome";
strncat(str1, str2, 3);
strncat(str1, str3, 2);
printf("%s\n", str1);
}
이렇게 된다.
strcmp
두 문자열을 비교하는 함수이다. 완전히 같은 경우 0이 나오고, 음수가 나오는 경우 왼쪽이 더 작은 거고, 양수가 나오는 경우에는 오른쪽이 더 작은 거다. 앞에있는 거 기준이라고 생각하면 된다.
int strcmp(const char *str1, const char *str2);
#strcmp(앞에거, 뒤에거)
예시 코드를 보면
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char* str1 = "Hello";
char* str2 = "World";
char* str3 = "Hello";
int result1 = strcmp(str1, str2);
int result2 = strcmp(str1, str3);
int result3 = strcmp(str2, str3);
printf("%d, %d, %d\n", result1, result2, result3);
}
이렇게 비교한 값을 int 형식으로 저장을 한 다음에 출력하면 된다. H가 W보다 앞에있기 때문에 더 작은 수기때, 앞에 수가 더 작아서 -15가 나온 것을 알 수 있다.
strncmp
얘도 똑같아. 문자열 비교하는데, 지정된 길이만큼 비교하는 것이다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char* str1 = "HelloSeo";
char* str2 = "WorldMin";
char* str3 = "HelloJae";
int result1 = strncmp(str1, str2, 5);
int result2 = strncmp(str1, str3, 5);
printf("%d, %d\n", result1, result2);
}
이렇게 result2를 보면 5글자만 비교하여 0이 나온것(같다)을 알 수 있다.
strstr
문자열에서 특정 문자열(부분문자열)의 첫 번째 위치를 찾는 함수이다.
char *strstr(const char *haystack, const char *needle);
#strstr(원본 문자열, 찾을 문자열)
위치를 반환해주기 때문에 주소를 담기 위한 포인터가 있어야한다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char str[] = "Hello World";
char* ptr = strstr(str, "World");
if(ptr != NULL){
printf("%p, %c %c %c %c %c\n", ptr,*ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4));
}
}
문자열이 일치한 게 없다면 NULL을 반환하기에, if문으로 null을 처리해준다.
strchr
아까는 문자열의 시작 위치라면 이번엔 문자의 시작 위치이다. 가장 앞에서 나온 첫번째 거 위치를 찾아낸다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char str[] = "Hello World";
char* ptr = strchr(str, 'e');
if(ptr != NULL){
printf("%p, %c\n", ptr, *ptr);
}
int index;
char* start = str;
index = ptr - start;
printf("index : %d\n", index);
}
이렇게 위에처럼 strchr로 포인터에 넣어주고 사용하면 된다.
근데 인덱스를 알고 싶다? ptr - start로 계산하면 알아서 인덱스 값이 나올 것이다
strrchr
이번엔 뒤에서부터 계산하는 거다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char str[] = "Hello World";
char* ptr = strrchr(str, 'o');
if(ptr != NULL){
printf("%p, %c\n", ptr, *ptr);
}
int index;
char* start = str;
index = ptr - start;
printf("index : %d\n", index);
}
만약 strchr이 었다면 4 인덱스가 나왔을 것이다. strrchr이라서 뒤에서부터 계산해서 7이 나온 것이다.
strtok
구분자를 기준으로 나누는 것이다. 파이썬으로 따지면 split
char *strtok(char *str, const char *delim);
#strtok(문자열, 뭐로구분?)
예시를 보면
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char str[] = "Hello,World";
char *token = strtok(str, ",");
while (token !=NULL){
printf("%s\n", token);
token = strtok(NULL, ",");
}
}
주희해야할 것은, strtok 할 때에는 ","를 사용해야한다는 점이다,
동작 방법이 문자열을 내부적으로 저장하고, 구분자를 기준으로 문자열을 자르고, 분리된 토큰 뒤에 자동으로 널 문자를 추가하고,
이후에 이전 호출 이후의 다음 토큰을 반환하고, 더이상 토큰이 없으면 null인 건데..
strtok(NULL, ",")는 이전 호출에서 저장된 위치 이후부터 ,를 기준으로 다음 토큰을 반환하라는 의미이다.
뭐 아무튼.. " " 이거 큰따옴표 써야하는 거 주의하고..
그리고 원본 문자열을 수정하기 떄문에 주의해야한다.
이렇게 좀 많은 문자열 함수들을 알아보았다.
도전
(1) 문자열을 입력받고 공백을 제외하고 다시 출력하기
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char str[100];
printf("Input sentence : ");
fgets(str, sizeof(str), stdin);
char* token = strtok(str, " ");
while(token!=NULL){
printf("%s", token);
token = strtok(NULL, " ");
}
}
(2) 문장을 입력받고, 단어를 입력해주었을 때 해당 단어가 몇 번나왔는지 세기
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main(){
char str[1000];
char lowerStr[1000];
printf("Input sentence : ");
fgets(str, sizeof(str), stdin);
for (int i=0;i<strlen(str);i++){
lowerStr[i] = tolower(str[i]);
}
char word[1000];
printf("Input word : ");
scanf("%s", word);
char* token = strtok(str, " ");
int count = 0;
while(token!=NULL){
if(!strcmp(token, word )){
count++;
}
token = strtok(NULL, " ");
}
printf("%d\n", count);
}
에필로그
다음엔 ctype.h?
'KnockOn' 카테고리의 다른 글
[1주차 TIL] KnockOn Bootcamp 웹이란? (4) | 2024.12.02 |
---|---|
[KnockOn] Linux/Ubuntu C언어 구조체 - 1 (0) | 2024.11.25 |
[KnockOn] Linux/Ubuntu C언어 문자열 (0) | 2024.11.23 |
[KnockOn] Linux/Ubuntu C언어 포인터 (0) | 2024.11.21 |
[KnockOn] Linux/Ubuntu C언어 함수 -2 (0) | 2024.11.20 |