Coding/C

[C언어] 문자열 함수 사용하기 - 코딩도장

GunP4ng 2024. 1. 14. 23:11

[코딩도장] Unit 41 ~ 45


1. 문자열 길이 구하기 (strlen)

1. strlen

size_t strlen(const *_str)

 

strlen 함수는 문자열의 길이를 구하는 함수이다

<string.h> 헤더 파일에 선언되어 있다

char *s1 = "Hello";       // 포인터에 문자열 Hello의 주소 저장
char s2[10] = "Hello";    // 크기가 10인 char형 배열을 선언하고 문자열 할당

printf("%d\n", strlen(s1));    // 5: strlen 함수로 문자열의 길이를 구함
printf("%d\n", strlen(s2));    // 5: strlen 함수로 문자열의 길이를 구함

strlen 함수가 문자열의 길이를 구할 때는 NULL 부분은 포함하지 않는다

s2 와 같이 배열의 크기와 상관없이 문자열의 길이만 구한다

 

 

2. 문자열 비교하기 (strcmp)

1. strcmp

int strcmp(const *_str1, char *const_str2)

 

strcmp 함수는 두 문자열을 비교하고 결과값을 정수로 반환하는 함수이다

<string.h> 헤더파일에 선언되어 있다

char s1[10] = "Hello";
char *s2 = "Hello";

int ret = strcmp(s1, s2);    // 두 문자열이 같은지 문자열 비교

printf("%d\n", ret);         // 0: 두 문자열이 같으면 0

strcmp(s1, s2) 와 같이 비교할 문자열을 넣어주면 정수로 반환한다

  • -1 : ASCII 코드 기준으로 문자열(s2)가 클 때
  • 0 :  ASCII 코드 기준으로 문자열이 같을 때
  • 1 : ASCII 코드 기준으로 문자열(s1)이 클 때

strcmp 함수로 문자열 비교

strcmp 함수는 Windows(Visual Studio) 에서는 문자열이 다르면 1, -1 을 반환한다

리눅스와 OS X 에서는 ASCII 코드값의 차이를 반환한다

 

 

3. 문자열 복사하기 (strcpy)

1. strcpy

char *strcpy(char *_Dest, char const *_Source)

 

strcpy 함수는 문자열을 다른곳으로 복사한다

<string.h> 헤더파일에 선언되어 있다

char s1[10] = "Hello";    // 크기가 10인 char형 배열을 선언하고 문자열 할당
char s2[10];              // 크기가 10인 char형 배열을 선언

strcpy(s2, s1);        // s1의 문자열을 s2로 복사
    
printf("%s\n", s2);    // Hello

strcpy(s2,  s1)와 같이 복사된 결과가 저장될 문자열과 복사할 문자열을 넣는다

strcpy 함수로 문자열 복사

복사된 결과가 저장될 배열의 크기는 NULL까지 들어갈 수 있어야 한다

 

※ 문자열 포인터는 읽기 전용이기 때문에 문자열을 복사할 수 없다

malloc 함수로 메모리를 할당하고 사용하면 복사할 수 있다

 

4. 문자열 붙이기 (strcat)

1. strcat

char *strcat(char *_Destination, char const *_Source)

 

strcat 함수는 두 문자열을 붙여서 최종 문자열의 포인터를 반환한다

<string.h> 헤더파일에 선언되어 있다

char s1[10] = "world";
char s2[20] = "Hello"; // s2 뒤에 붙일 것이므로 배열 크기를 크게 만듦

strcat(s2, s1);        // s2 뒤에 s1를 붙임

printf("%s\n", s2);    // Helloworld

strcar(s2, s1)과 같이 최종 결과가 나올 문자열과 붙일 문자열을 넣는다

이렇게 하면 s2 뒤에 s1 이 붙어서 출력된다

strcat 함수로 문자열 붙이기

문자열을 붙이더라도 배열이 모자라지 않게 크기를 넉넉하게 만들어야 한다

 

※ 문자열 포인터는 읽기 전용이기 때문에 문자열을 붙일 수 없다

malloc 함수로 메모리를 할당하고 사용하면 붙일 수 있다

 

 

5. 문자열 만들기(sprintf)

1. sprintf

int sprintf(char *const_Buffer, char const *const_Format, ...)

 

sprintf 함수는 서식을 지정하여 문자열을 출력하는 함수이다

<stdio.h> 헤더파일에 선언되어 있다

문자열의 오른쪽부터 문자를 찾고 싶다면 strrchr 함수를 사용하면 된다

char s1[20];    // 크기가 20인 char형 배열을 선언

sprintf(s1, "Hello, %s", "world!");    // "Hello, %s"로 서식을 지정하여 s1에 저장

printf("%s\n", s1);    // Hello, world!: 문자열 s1 출력

sprintf 함수에 문자열을 저장할 배열, 문자열을 만들 서식, 문자열 만들 값을 순서대로 넣는다

Hello, %s 에서 Hello, world! 가 s1 에 저장된다

s1 과 같이 문자열을 저장할 빈 배열을 버퍼(Buffer) 라고 부른다

sprintf 를 사용하여 배열 형태로 문자열 만들기

서식지정자를 사용하기 때문에 C언어의 다른 자료형도 문자열로 만들 수 있다

 

 

6. 문자열 찾기 (strchr, strstr)

1. 문자열에서 문자 찾기 (strchr, strrchr)

char *strchr(char *const_String, int const_Ch)

 

문자열에서 특정 문자를 찾기 위해선 strchr 함수를 사용해야 한다

<string.h> 헤더파일에 선언되어 있다

char s1[30] = "A Garden Diary";  // 크기가 30인 char형 배열을 선언하고 문자열 할당

char *ptr = strchr(s1, 'a');     // 'a'로 시작하는 문자열 검색, 포인터 반환

strchr 함수에 문자열과 검색할 문자를 넣으면

해당 문자로 시작하는 문자열의 위치(포인터)를 반환한다

 

'a' 로 시작하는 부분을 더 찾기 위해서는  while 반복문을 사용해야 한다

while (ptr != NULL)              // 검색된 문자열이 없을 때까지 반복
{
    printf("%s\n", ptr);         // 검색된 문자열 출력
    ptr = strchr(ptr + 1, 'a');  // 포인터에 1을 더하여 a 다음부터 검색
}

검색된 문자열의 포인터를 strchr 함수에 넣어서 반복한다

NULL 이 나오면 문자열이 없기 때문에 반복을 끝낸다

strchr 함수로 문자 검색

strchr 함수는 대소문자를 구분하기 때문에 검색할 문자를 'a' 로 지정하면 'A'는 건너뛴다

strchr 함수로 문자 검색

while 로 반복하다가 NULL을 만나면 NULL을 반환한뒤 반복문을 끝낸다

※ 문자열에서 문자를 오른쪽 끝부터 찾고 싶다면 strrchr 함수를 사용하면 된다

2. 문자열에서 문자열 찾기 (strstr)

char *strstr(char * const_String, char const * const_SubString)

 

문자열에서 문자열을 찾기 위해선 strstr 함수를 사용해야 한다

<string.h> 헤더파일에 선언되어 있다

char s1[30] = "A Garden Diary";     // 크기가 30인 char형 배열을 선언하고 문자열 할당

char *ptr = strstr(s1, "den");      // den으로 시작하는 문자열 검색, 포인터 반환

printf("%s\n", ptr);    // den Diary

strstr 함수에 문자열과 검색할 문자열을 넣어주면

해당 문자열로 시작하는 문자열의 위치(포인터)를 반환한다

검색한 문자열만 나오는 것이 아닌 뒤에 오는 모든 문자열이 나온다

strstr 함수로 문자열 검색

strstr 함수도 대소문자를 구분한다

while (ptr != NULL)                // 검색된 문자열이 없을 때까지 반복
{
    printf("%s\n", ptr);           // 검색된 문자열 출력
    ptr = strstr(ptr + 1, "den");  // den 포인터에 1을 더하여 e부터 검색
}

또한 while 반복문으로 반복할 수 있다

 

 

7. 문자열 자르기 (strtok)

1. strtok

char *strtok(char *_String, char const *_Delimiter)

 

strtok 함수는 특정 문자를 기준으로 문자열을 자르는 함수이다

<string.h> 헤더파일에 선언되어 있다

char s1[30] = "The Little Prince";  // 크기가 30인 char형 배열을 선언하고 문자열 할당

char *ptr = strtok(s1, " ");

strtok(s1, " ")와 같이 " " 공백문자를 넣어주면 공백으로 구분하여 문자열을 자른다

※ 기준 문자를 ' ' 로 묶으면 안된다

 

strtok 함수는 잘린 문자열을 한번에 얻을 수 없어서 while 반복문으로 문자열을 자르다가

문자열이 나오지 않으면 반복문을 끝내는 방식으로 사용한다

while (ptr != NULL)               // 자른 문자열이 나오지 않을 때까지 반복
{
    printf("%s\n", ptr);          // 자른 문자열 출력
    ptr = strtok(NULL, " ");      // 다음 문자열을 잘라서 포인터를 반환
}

ptr = strtok(NULL, " ") 처럼 자를 문자열 부분에 NULL 을 넣어준다

strtok 함수로 문자열 자르기 (1)

strtok 함수는 처음에만 자를 문자열을 넣어주고

그 다음부터는 NULL을 넣어준다

strtok 함수로 문자열 자르기 (2)

while 반복문 안의 strtok 에 NULL을 넣어주어 잘린 문자열만큼 다음 문자로 이동한다

그리고 다시 공백문자를 찾아서 NULL 로 채운뒤 "Little" 을 자른다

strtok 함수로 문자열 자르기 (3)

다시 strtok 에 NULL을 넣어주어 앞에서 잘린 문자열만큼 다음 문자로 이동한다

문자열 마지막의 NULL을 만났기 때문에

NULL을 그대로 두고 "Prince 를 반환한다

strtok 함수로 문자열 자르기 (4)

문자열의 끝인 NULL을 만났기 때문에 자를 문자열이 없으므로

NULL을 반환하고 while 반복문을 끝낸다

 

strtok 함수는 문자열을 새로 생성해서 반환하는 것이 아닌

자르는 부분을 NULL로 채운 뒤 잘린 문자열의 포인터를 반환한다

※ 원본 문자열의 내용을 바꾸므로 사용에 주의해야 한다


8. 심사문제

41.6 문자열 길이 구하기

표준 입력으로 길이 30 이하의 어떤 문자열이 입력됩니다. 입력된 문자열의 길이를 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.)

정답에는 C 언어 컴파일러에서 정상적으로 컴파일 되는 전체 코드를 입력해야 합니다.

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
    char s1[40];

    scanf("%s", s1);

    printf("%lu", strlen(s1));

    return 0;
}

strlen 함수는 size_t 자료형이다

따라서 서식지정자 %lu 를 사용한다


41.7 문자열 비교하기

표준 입력으로 길이 30 이하의 문자열 두 개가 입력됩니다(입력되는 문자열은 공백으로 구분됩니다.) 두 문자열이 같은지 다른지 비교 결과를 정수로 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.)

정답에는 C언어 컴파일러에서 정상적으로 컴파일 되는 전체 코드를 입력해야 합니다

주의사항 : 온라인 심사는 리눅스에서 실행됩니다. 따라서 strcmp 함수의 반환값을 반환하는 코드로 작성해야 합니다.

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
    char s1[40];
    char s2[40];

    scanf("%s %s", s1, s2);

    printf("%d", strcmp(s1, s2));
    
    return 0;
}

42.10 문자 배열 복사하기

표준 입력으로 길이 30 이하의 어떤 문자열이 입력됩니다. 다음 소스 코드를 완성하여 두 pritnf 가 같은 문자열을 출력하게 만드세요.

정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
    char s1[31];
    char s2[31];

    _______________
    _______________
 
    printf("%s\n", s1);
    printf("%s\n", s2);

    return 0;
}

 

정답

scanf("%s", s1);
strcpy(s2, s1);

42.11 두 문자열 붙이기

표준 입력으로 길이 30 이하의 어떤 문자열이 입력됩니다. 다음 소스코드를 완성하여 입력된 문자열 뒤에 "th"가 붙어서 출력되게 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.)

정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
    char s1[40];

    ______________________________________
    ______________________________________

    printf("%s\n", s1);

    return 0;
}

 

정답

scanf("%s", s1);
strcat(s1, "th");

43.6 서수 줄임말 문자열 만들기

표준 입력으로 1과 7사이의 숫자와 길이 30 이하의 문자열이 입력됩니다. 다음 소스 코드를 완성하여 입력된 숫자의 서수 줄임말(1st, 2nd, 3rd, 4th, 5th, 6th, 7th)과 입력된 문자열이 출력되게 만드세요.

정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int number;
    char name[31], result[40];

    ______________________________________

    ______________________________________
    ______________________________________
    ______________________________________
    ______________________________________
    ______________________________________
    ______________________________________
    ______________________________________
    ______________________________________

    printf("%s\n", result);

    return 0;
}

 

정답

scanf("%d %s", &number, name);

switch (number) {
case 1:
    sprintf(result, "%dst %s", number, name);
    break;
case 2:
    sprintf(result, "%dnd %s", number, name);
    break;
case 3:
    sprintf(result, "%drd %s", number, name);
    break;
default:
    sprintf(result, "%dth %s", number, name);
    break;
}

44.7 공백 개수 세기

표준 입력으로 길이 1,000 이하의 문자열이 입력됩니다. 입력된 문자열에서 공백의 개수를 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.)

scanf 에서 공백을 포함한 문자열을 입력받으려면 서식지정자로 %[^\n]s 를 사용하면 됩니다

정답에는 C언어 컴파일러에서 정상적으로 컴파일 되는 전체코드를 입력해야 합니다.

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
    char s1[1001];
    scanf("%[^\n]s", s1);

    char *ptr = strchr(s1, ' ');

    int count = 0;
    while (ptr != NULL) {
        count += 1;
        ptr = strchr(ptr + 1, ' ');
    }
    printf("%d", count);

    return 0;
}

45.7 문자열 자르기

표준 입력으로 길이 60 이하의 인터넷 도메인이 입력됩니다. 점을 기준으로 문자열을 분리하여 각 줄마다 출력하세요.

정답에는 C언어 컴파일러에서 정상적으로 컴파일 되는 전체코드를 입력해야 합니다.

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
    char s1[61];
    scanf("%s", s1);

    char *tok = strtok(s1, ".");

    while (tok != NULL) {
        printf("%s\n", tok);
        tok = strtok(NULL, ".");
    }

    return 0;
}

45.8 특정 단어 개수 세기

표준 입력으로 길이 1,000 이하의 문자열이 입력됩니다. 입력된 문자열에서 "the"의 개수를 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다.) 단, 모든 문자가 소문자인 "the"만 찾으면 되며 "them", "there", "their" 등은 포함하지 않아야 합니다

정답에는 C언어 컴파일러에서 정상적으로 컴파일 되는 전체코드를 입력해야 합니다

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
    int count = 0;
    char s1[1001];
    scanf("%[^\n]s", s1);

    char *ptr = strtok(s1, " .,");

    while (ptr != NULL) {
        int ret = strcmp(ptr, "the");
        if (ret == 0) {
            count += 1;
        }
        ptr = strtok(NULL, " .,");
    }
    printf("%d", count);

    return 0;
}

strtok 함수로 공백(" "), 점(.), 콤마(,)를 기준으로 문자열을 잘라준다

그 뒤 strcmp 함수로 자른 문자열이 "the" 와 같은지 확인하고

같다면 count 의 값을 1 늘린다