[KnockOn] Linux/Ubuntu C언어 <string.h>

2024. 11. 24. 18:02· KnockOn
목차
  1. 프롤로그
  2. string.h 헤더
  3. strlen
  4. strcpy
  5. strncpy
  6. strcat
  7. strncat
  8. strcmp
  9. strncmp
  10. strstr
  11. strchr
  12. strrchr
  13. strtok
  14. 도전
  15. (1) 문자열을 입력받고 공백을 제외하고 다시 출력하기
  16. (2) 문장을 입력받고, 단어를 입력해주었을 때 해당 단어가 몇 번나왔는지 세기
  17. 에필로그
728x90
반응형

프롤로그

ELITE HACKER Bootcamp 3rd 4주차 수업 공부 내용

aws 우분투 서버 하나 파서 연습

string.h 헤더 

 

 

string.h 헤더

C언어에서 문자열을 다루는 몇몇 함수들은 이미 string.h 헤더 안에 저장되어 있다. 이 함수들을 사용하면 문자열 관련하여 어제 작성했던 코드들 매우 쉽게...원하는 대로 사용할 수 있다.

2024.11.23 - [KnockOn] - [KnockOn] Linux/Ubuntu C언어 문자열

 

[KnockOn] Linux/Ubuntu C언어 문자열

프롤로그ELITE HACKER Bootcamp 3rd 4주차 수업 공부 내용aws 우분투 서버 하나 파서 연습문자열의 개념, 용도, 선언과 초기화, 배열, 포인터  문자열2024.11.14 - [KnockOn] - [KnockOn] Linux/Ubuntu C언어 입출력함

taesan-smj.tistory.com

여기 마지막 도전 부분에 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?

 

728x90
반응형
저작자표시 비영리 (새창열림)

'KnockOn' 카테고리의 다른 글

[1주차 TIL] KnockOn Bootcamp 웹이란?  (4) 2024.12.02
[KnockOn] Linux/Ubuntu C언어 구조체 - 1  (0) 2024.11.25
[KnockOn] Linux/Ubuntu C언어 문자열  (1) 2024.11.23
[KnockOn] Linux/Ubuntu C언어 포인터  (1) 2024.11.21
[KnockOn] Linux/Ubuntu C언어 함수 -2  (0) 2024.11.20
  1. 프롤로그
  2. string.h 헤더
  3. strlen
  4. strcpy
  5. strncpy
  6. strcat
  7. strncat
  8. strcmp
  9. strncmp
  10. strstr
  11. strchr
  12. strrchr
  13. strtok
  14. 도전
  15. (1) 문자열을 입력받고 공백을 제외하고 다시 출력하기
  16. (2) 문장을 입력받고, 단어를 입력해주었을 때 해당 단어가 몇 번나왔는지 세기
  17. 에필로그
'KnockOn' 카테고리의 다른 글
  • [1주차 TIL] KnockOn Bootcamp 웹이란?
  • [KnockOn] Linux/Ubuntu C언어 구조체 - 1
  • [KnockOn] Linux/Ubuntu C언어 문자열
  • [KnockOn] Linux/Ubuntu C언어 포인터
성밍쟁
성밍쟁
성밍쟁 공붕방
너드인의 밤성밍쟁 공붕방
성밍쟁
너드인의 밤
성밍쟁
전체
오늘
어제
  • 분류 전체보기 (182)
    • 일상 (1)
    • 스펙업 (7)
      • 학회 (0)
      • 멋쟁이사자처럼 (2)
      • 2024 winter-study (5)
    • 코딩테스트 - 백준 (9)
    • 보안 스터디 (56)
      • 시스템 해킹 (10)
      • 리버스 엔지니어링 (0)
      • 웹 해킹 (38)
      • 암호학 (8)
    • bandit (15)
    • 웹 개발 (11)
    • 머신러닝 (0)
    • 데이터베이스 (9)
    • KnockOn (72)
    • DevOps (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 드림핵
  • /bin
  • 1074
  • 11656
  • 1193
  • 2563
  • 3Des
  • 9613
  • AES
  • Alias

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
성밍쟁
[KnockOn] Linux/Ubuntu C언어 <string.h>
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.