본문 바로가기
GD's IT Lectures : 기초부터 시리즈/C, C++ 기초부터 ~

[C/C++ 프로그래밍] 10. 문자열

by GDNGY 2023. 5. 16.

Chapter 10. 문자열

C/C++ 프로그래밍에서 문자의 집합을 처리하는 방법에 대해 다룹니다. 이 챕터에서는 문자열의 개념, 선언, 초기화, 사용법, 그리고 문자열을 함수의 인자로 전달하는 방법과 문자열 관련 함수들에 대해 배웁니다. 문자열의 메모리 구조와 포인터의 관계도 이해하게 될 것입니다. 그리고 여러 프로그램 예제를 통해 실제 문자열 처리에 대한 이해를 높이고, 마지막으로는 동적 메모리 할당을 이용한 문자열 처리와 문자열의 다양한 응용에 대해서도 배우게 됩니다.

 


 

반응형

 


[Chapter 10. 문자열]


10.1. 문자열의 개념

10.1.1. 문자열이란?

10.1.2. 문자열의 필요성

 

10.2. 문자열의 선언과 초기화

10.2.1. 문자열 선언하기

10.2.2. 문자열 초기화하기

 

10.3. 문자열의 사용

10.3.1. 문자열의 접근 방식

10.3.2. 문자열과 반복문

 

10.4. 문자열과 함수

10.4.1. 문자열을 인자로 받는 함수

10.4.2. 함수가 문자열을 반환하기

 

10.5. 문자열 관련 함수

10.5.1. 문자열 길이 구하기: strlen

10.5.2. 문자열 복사하기: strcpy, strncpy

10.5.3. 문자열 비교하기: strcmp, strncmp

10.5.4. 문자열 연결하기: strcat, strncat

10.5.5. 문자열에서 문자/부분 문자열 찾기: strchr, strrchr, strstr

 

10.6. 문자열과 포인터

10.6.1. 문자열의 메모리 구조

10.6.2. 문자열과 포인터의 관계

10.7. 문자열을 사용한 프로그램 예제

10.7.1. 단어 카운팅 프로그램 작성

10.7.2. 문자열 정렬 프로그램 작성

 

10.8. 문자열에 대한 고급 주제

10.8.1. 동적 메모리 할당을 이용한 문자열 처리

10.8.2. 문자열의 다양한 응용

 


10.1. 문자열의 개념

문자열이 무엇인지와 그 필요성에 대해 배우게 됩니다. 문자열은 문자들의 배열로, 다양한 문자 데이터를 효과적으로 다루는 데 필수적인 개념으로 어떤 정보를 보다 이해하기 쉽게 표현하는 데 유용합니다.

10.1.1. 문자열이란?

문자열(string)은 개별 문자들이 연결된 것을 말합니다. C/C++에서 문자열은 문자 배열로 표현되며, 이는 일련의 문자가 메모리 상에 연속적으로 배치된 구조를 가리킵니다. 문자열의 마지막에는 항상 널 문자('\0')가 존재하며, 이 특징은 문자열과 일반 배열을 구분하게 해 줍니다.

 

[예제]

char hello[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 널 문자를 명시적으로 추가
char world[] = "world"; // 널 문자가 자동으로 추가됨

 

위의 예제에서, 'hello'라는 문자열은 각 문자를 개별적으로 배열에 할당하며, 문자열의 끝을 알리는 널 문자('\0')를 직접 삽입합니다. 두 번째 예제에서는 문자열 리터럴을 사용해 'world'라는 문자열을 생성하며, 이 경우 C++ 컴파일러가 자동으로 널 문자를 추가합니다.

 

[예제]

std::string greeting = hello + std::string(" ") + world; // C++의 std::string 클래스를 이용한 문자열 합치기
std::cout << greeting << std::endl; // "Hello world" 출력

 

이 예제에서는 C++의 std::string 클래스를 이용해 두 문자열을 결합하고, 결과를 출력합니다. 이를 통해 문자열을 유연하게 다룰 수 있음을 알 수 있습니다.

 

10.1.2. 문자열의 필요성

문자열은 우리가 데이터를 사람이 이해하기 쉬운 형태로 표현하는 데 필수적입니다. 사용자의 이름, 주소, 웹사이트의 URL, 책의 제목 등 일상생활에서 흔히 볼 수 있는 많은 정보들은 모두 문자열로 표현됩니다. 또한 프로그램의 출력 결과를 사용자에게 보여주거나, 사용자로부터 입력을 받는 등의 상황에서도 문자열은 중요한 역할을 합니다.

 

[예제]

std::string firstName = "John";
std::string lastName = "Doe";
std::string fullName = firstName + " " + lastName;
std::cout << "Hello, " << fullName << "!\n"; // "Hello, John Doe!"를 출력

 

이 예제에서는 문자열 변수를 사용하여 사용자의 성과 이름을 각각 저장하고, 이들을 합쳐 전체 이름을 만들어 출력하고 있습니다. 이처럼 문자열은 다양한 형태의 정보를 표현하고 가공하는 데 광범위하게 사용됩니다.

 

 

 


10.2. 문자열의 선언과 초기화

문자열을 어떻게 선언하고 초기화하는지 배웁니다. 문자열은 문자 배열로 표현되며, 이 배열은 반드시 널 문자('\0')로 끝나야 합니다. 문자열 선언은 간단하게 char 배열로 선언할 수 있고, 초기화는 문자열 리터럴 또는 각 문자를 직접 지정하여 할 수 있습니다. C++에서는 더욱 쉽게 std::string을 사용하여 선언과 초기화를 할 수 있습니다. 이 섹션을 통해 문자열의 기본적인 활용 방법을 이해하게 될 것입니다.

10.2.1. 문자열 선언하기

C/C++에서 문자열은 문자 배열로 표현됩니다. 배열이란 연속된 메모리 공간에 동일한 타입의 데이터를 저장하는 데이터 구조입니다. 이러한 이해를 바탕으로 문자열을 선언하는 방법을 배워봅시다.

 

[예제]

char string[6]; // C에서 문자열 선언

 

[예제]

#include <string>
std::string str; // C++에서 문자열 선언

 

위의 예제에서 char string[6];은 string이라는 이름의 문자 배열을 선언하는 구문입니다. 여기서 6은 배열의 크기를 의미하며, 이 배열은 최대 6개의 문자를 저장할 수 있습니다.


그러나 문자열을 표현하기 위해서는 마지막에 항상 널 문자('\0')가 포함되어야 하므로, 실제로는 5개의 문자와 1개의 널 문자를 저장할 수 있습니다.


10.2.2. 문자열 초기화하기

문자열 초기화는 쉽게 이해할 수 있습니다. 선언과 동시에 문자열 리터럴을 사용하여 초기화할 수 있습니다.

 

[예제]

char string[] = "Hello"; // C에서 문자열 초기화

 

[예제]

std::string str = "Hello"; // C++에서 문자열 초기화

 

위의 예제에서 "Hello"는 문자열 리터럴이며, 이는 'H', 'e', 'l', 'l', 'o', '\0'의 6개 문자로 구성된 문자 배열입니다. char string[] = "Hello";는 string 배열을 "Hello" 문자열로 초기화하는 구문입니다. 문자열의 길이만큼의 크기를 가진 문자 배열이 생성되고, 각 문자가 순서대로 배열에 저장된 후 마지막에는 널 문자가 추가됩니다.

 

C++에서는 std::string을 사용하여 문자열을 더 쉽게 다룰 수 있습니다. 문자열의 길이를 자동으로 관리하고, 문자열 연산이 훨씬 쉬워집니다. 이를 위해 <string> 헤더 파일을 include 해야 합니다.

 

[예제]

std::string str1 = "Hello, ";
std::string str2 = "world!";
std::string str3 = str1 + str2; // "Hello, world!"라는 문자열을 생성

 

이처럼 C++의 std::string은 문자열을 간편하게 조작할 수 있는 다양한 연산자와 메서드를 제공합니다.

 

이러한 방식으로 문자열을 선언하고 초기화하면, 이후에 다양한 연산을 통해 문자열을 효율적으로 관리할 수 있습니다. 문자열을 사용하는 다양한 프로그래밍 상황에서 문자열 선언과 초기화 방법은 기본적이면서도 중요한 개념입니다.

 


10.3. 문자열의 사용

프로그램에서 텍스트 데이터를 다루는 데 있어 핵심적인 요소입니다. 문자열을 사용하면 사용자 입력을 처리하거나 메시지를 출력하는 등 다양한 기능을 수행할 수 있습니다. C/C++에서는 문자열을 배열이나 포인터로 다루며, 다양한 문자열 처리 함수를 이용해 문자열 조작이 가능합니다. 사용법을 익히면 프로그램에 다양한 상황에 대응할 수 있는 풍부한 인터랙션을 제공할 수 있습니다.

10.3.1. 문자열의 접근 방식

문자열은 기본적으로 문자들의 배열로 볼 수 있습니다. 그래서 배열에 접근하는 것처럼 문자열에도 접근할 수 있습니다. C/C++에서 문자열은 문자의 배열로, 각 문자는 배열의 인덱스로 접근 가능합니다.

 

[예제]

#include <stdio.h>

int main() {
    char str[6] = "Hello";
    for (int i = 0; i < 5; i++) {
        printf("%c\n", str[i]);
    }
    return 0;
}

 

이 예제에서 문자열 "Hello"는 각 문자가 하나의 셀에 저장된 배열입니다. 'str[0]'은 'H', 'str[1]'은 'e'를 의미하고, 이런 식으로 계속됩니다.

 

10.3.2. 문자열과 반복문

문자열은 그 길이를 알고 있으면 반복문을 사용해 각 문자에 접근할 수 있습니다. 문자열의 끝은 NULL 문자('\0')로 표시되므로, 이 문자를 만날 때까지 반복하는 것이 일반적입니다.

 

[예제]

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    for (char c : str) {
        std::cout << c << '\n';
    }
    return 0;
}

 

C++에서는 문자열에 대한 반복문을 더 쉽게 작성할 수 있습니다. 위 예제에서는 범위 기반 for 반복문을 사용하여 문자열의 모든 문자를 출력합니다. 이렇게 하면 각 문자에 쉽게 접근할 수 있습니다.

 

이렇게 문자열에 접근하는 방법을 이해하고 익히면 문자열을 이용한 다양한 작업을 할 수 있게 됩니다. 문자열은 사용자의 입력을 받아 처리하거나 사용자에게 메시지를 전달하는 등, 프로그램에서 중요한 역할을 하는 데이터 타입이므로 이를 잘 활용하는 것이 중요합니다.

 


10.4. 문자열과 함수

문자열을 사용하는 함수에 대한 내용을 다룹니다. 프로그래밍에서 문자열은 데이터를 처리하고, 사용자에게 정보를 전달하는 데 매우 중요한 도구입니다. C/C++에서는 문자열을 인수로 받아들이거나 반환하는 함수를 작성하는 방법에 대해 배울 수 있습니다. 이를 통해 프로그램에서 문자열을 더욱 효율적으로 활용할 수 있습니다.

10.4.1. 문자열을 인자로 받는 함수

문자열을 인자로 받는 함수는 프로그램의 다양한 부분에서 텍스트 데이터를 처리하는 데 사용됩니다. 이러한 함수의 예로는 문자열의 길이를 반환하는 함수, 문자열 내의 특정 문자를 찾는 함수, 문자열을 다른 문자열로 교체하는 함수 등이 있습니다.

 

아래는 C++에서 문자열의 길이를 반환하는 함수의 예입니다.

 

[예제]

#include <iostream>
#include <string>
using namespace std;

int getLength(string str) {
    return str.length();
}

int main() {
    string text = "Hello, World!";
    cout << "The length of the text is: " << getLength(text) << endl;
    return 0;
}

 

위의 예제에서 getLength라는 함수는 문자열을 입력으로 받아 해당 문자열의 길이를 반환합니다. 이 함수는 main 함수 내에서 호출되어 사용자가 입력한 문자열의 길이를 출력합니다.

 

C 언어에서는 문자열을 인자로 받는 함수를 작성할 때 주의해야 합니다. C 언어에서 문자열은 문자형 배열이므로, 배열의 이름(즉, 배열의 첫 번째 요소를 가리키는 포인터)을 함수에 전달합니다. 그러면 함수는 이 포인터를 통해 원래 배열에 접근할 수 있습니다.

 

[예제]

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

void printLength(char *str) {
    printf("The length of the text is: %lu\n", strlen(str));
}

int main() {
    char text[] = "Hello, World!";
    printLength(text);
    return 0;
}

 

위의 예제에서 printLength 함수는 문자 포인터를 입력으로 받아 해당 문자열의 길이를 출력합니다.

 

10.4.2. 함수가 문자열을 반환하기

함수가 문자열을 반환하는 것은 문자열을 생성하거나 조작한 결과를 프로그램의 다른 부분으로 전달하는 데 사용됩니다. 하지만 문자열을 반환하는 함수를 작성할 때는 메모리 관리에 주의해야 합니다. 특히 C 언어에서는 문자열이 메모리에서 동적으로 할당되므로, 함수가 반환한 후에도 이 메모리가 유효하게 유지되도록 관리해야 합니다.

 

C++에서는 std::string 객체를 사용하여 문자열을 반환하는 것이 간단합니다.

 

[예제]

#include <iostream>
#include <string>
using namespace std;

string makeGreeting(string name) {
    return "Hello, " + name + "!";
}

int main() {
    string greeting = makeGreeting("Alice");
    cout << greeting << endl;
    return 0;
}


위의 예제에서 makeGreeting 함수는 이름을 입력으로 받아 인사말 문자열을 생성하여 반환합니다.

 

C 언어에서는 문자열을 반환하는 것이 좀 더 까다롭습니다. 문자열을 동적으로 할당하고 이를 반환하면, 이 메모리는 함수가 반환한 후에도 유효하게 유지됩니다. 그러나 이 메모리는 나중에 반드시 해제되어야 합니다.

 

[예제]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* makeGreeting(char *name) {
    char *greeting = (char*) malloc(strlen(name) + 8);
    strcpy(greeting, "Hello, ");
    strcat(greeting, name);
    strcat(greeting, "!");
    return greeting;
}

int main() {
    char *greeting = makeGreeting("Alice");
    printf("%s\n", greeting);
    free(greeting);
    return 0;
}

 

위의 예제에서 makeGreeting 함수는 이름을 입력으로 받아 인사말 문자열을 동적으로 생성하여 반환합니다. 이 함수에서 반환한 메모리는 main 함수에서 해제됩니다.

 


10.5. 문자열 관련 함수

C/C++에서 제공하는 문자열을 다루는 데 필요한 여러 가지 함수에 대해 다룹니다. 이는 문자열의 길이를 찾는 함수, 두 문자열을 비교하는 함수, 문자열 내에서 특정 문자나 부분 문자열을 찾는 함수 등이 포함됩니다. 이들 함수는 프로그래밍에서 흔히 사용되는 문자열 처리 작업을 쉽게 수행할 수 있도록 도와줍니다. C에서는 string.h 라이브러리에서 제공되는 함수들이 있으며, C++에서는 string 클래스 내장 함수를 사용할 수 있습니다.

10.5.1. 문자열 길이 구하기: strlen

문자열의 길이를 알아야 할 때가 많습니다. 이때 사용하는 함수가 strlen입니다. strlen 함수는 문자열의 길이를 반환합니다.

[예제] : C

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

int main() {
    char greeting[] = "Hello, World!";
    printf("Length of greeting string: %zu\n", strlen(greeting));
    return 0;
}

 

[예제] : C++

#include <iostream>
#include <string>

int main() {
    std::string greeting = "Hello, World!";
    std::cout << "Length of greeting string: " << greeting.length() << std::endl;
    return 0;
}

 

위의 예제에서 문자열 "Hello, World!"의 길이는 13입니다(공백과 구두점 포함).

 

10.5.2. 문자열 복사하기: strcpy, strncpy

문자열을 다른 문자열로 복사하려면 strcpy 또는 strncpy를 사용할 수 있습니다. strcpy는 문자열을 완전히 복사하고, strncpy는 지정한 길이만큼 문자열을 복사합니다.

[예제] : C

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

int main() {
    char str1[20];
    char str2[] = "Hello, World!";
    strcpy(str1, str2);

    printf("str1: %s\n", str1);
    return 0;
}

 

[예제] : C++

#include <iostream>
#include <string>

int main() {
    std::string str1;
    std::string str2 = "Hello, World!";
    str1 = str2;

    std::cout << "str1: " << str1 << std::endl;
    return 0;
}


10.5.3. 문자열 비교하기: strcmp, strncmp

문자열을 비교할 때는 strcmp 또는 strncmp 함수를 사용합니다. 이 함수들은 두 문자열이 동일한지, 아니면 어느 하나가 사전 순으로 앞서는지 판별합니다.

[예제] : C

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

int main() {
    char str1[] = "Hello, World!";
    char str2[] = "Hello, OpenAI!";
    int result = strcmp(str1, str2);
    if(result == 0)
        printf("Strings are equal.\n");
    else if(result < 0)
        printf("String1 is less than string2.\n");
    else
        printf("String1 is greater than string2.\n");
    return 0;
}

 

[예제] : C++

#include <iostream>
#include <string>

int main() {
    std::string str1 = "Hello, World!";
    std::string str2 = "Hello, OpenAI!";
    int result = str1.compare(str2);
    if(result == 0)
        std::cout << "Strings are equal.\n";
    else if(result < 0)
        std::cout << "String1 is less than string2.\n";
    else
        std::cout << "String1 is greater than string2.\n";
    return 0;
}

 

10.5.4. 문자열 연결하기: strcat, strncat

두 문자열을 연결하려면 strcat 또는 strncat 함수를 사용합니다. strcat은 두 문자열을 완전히 연결하고, strncat은 두 번째 문자열의 지정된 길이만큼만 첫 번째 문자열 끝에 추가합니다.

 

[예제] : C

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

int main() {
    char str1[50] = "Hello, ";
    char str2[] = "World!";
    strcat(str1, str2);
    printf("Concatenated string: %s\n", str1);
    return 0;
}

 

[예제] : C++

#include <iostream>
#include <string>

int main() {
    std::string str1 = "Hello, ";
    std::string str2 = "World!";
    str1 += str2;
    std::cout << "Concatenated string: " << str1 << std::endl;
    return 0;
}


10.5.5. 문자열에서 문자/부분 문자열 찾기: strchr, strrchr, strstr

문자열에서 특정 문자나 부분 문자열을 찾을 때에는 strchr, strrchr, strstr 등의 함수를 사용할 수 있습니다.

 

strchr 함수는 문자열에서 특정 문자를 찾아 그 위치를 반환하며, strrchr는 문자열에서 마지막으로 등장하는 특정 문자의 위치를 반환합니다. strstr 함수는 문자열에서 부분 문자열을 찾아 그 시작 위치를 반환합니다.

[예제] : C

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

int main() {
    char str[] = "Hello, World!";
    char *ch = strchr(str, 'W');
    printf("Character W found at position: %d\n", (int)(ch - str + 1));
    
    char *substr = strstr(str, "World");
    printf("Substring 'World' found at position: %d\n", (int)(substr - str + 1));
    return 0;
}

 

[예제] : C++

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    std::size_t found = str.find('W');
    if (found!=std::string::npos)
        std::cout << "Character W found at position: " << found+1 << std::endl;
    
    found = str.find("World");
    if (found!=std::string::npos)
        std::cout << "Substring 'World' found at position: " << found+1 << std::endl;
    return 0;
}


위의 C와 C++ 예제 코드들은 문자열을 사용하는 기본적인 방법을 보여줍니다. 이 외에도 문자열을 사용하는 방법은 무수히 많으므로, 필요한 기능에 따라 적절한 함수나 메서드를 찾아서 사용하시면 됩니다.

 


10.6. 문자열과 포인터

C/C++에서 문자열은 문자들의 배열로 표현됩니다. 이때 배열의 이름은 배열의 첫 번째 요소를 가리키는 포인터입니다. 따라서 문자열과 포인터는 밀접한 관계를 가지며, 문자열을 다루는 다양한 작업들에 포인터를 활용할 수 있습니다. 포인터를 이해하고 잘 사용한다면, 문자열에 대한 고급 조작을 할 수 있습니다. 포인터는 메모리 주소를 가리키는 변수로서, 문자열의 각 문자에 직접 접근하거나, 문자열을 효율적으로 조작하는 데 필요합니다.

10.6.1. 문자열의 메모리 구조

C/C++에서 문자열은 메모리에 배열 형태로 저장되며, 각각의 문자가 순차적으로 메모리의 공간을 차지합니다. 문자열은 NULL 문자('\0')로 종료되므로, "Hello"라는 문자열은 'H', 'e', 'l', 'l', 'o', '\0' 이런 식으로 메모리에 배치됩니다.

 

[예제]

#include <stdio.h>

int main() {
    char str[] = "Hello"; // 문자열 "Hello"를 선언합니다.
    int i;
    
    for (i = 0; str[i] != '\0'; i++) { // str[i]가 NULL 문자가 아닐 때까지 반복합니다.
        printf("%c is at memory address %p\n", str[i], &str[i]); // 각 문자와 그 메모리 주소를 출력합니다.
    }

    return 0;
}

 

위 예제에서, 우리는 "Hello"라는 문자열이 메모리에 어떻게 저장되는지 보여줍니다. 각 문자가 차지하는 메모리 주소를 출력해 문자열이 메모리에 연속적으로 저장되는 것을 확인할 수 있습니다.

 

10.6.2. 문자열과 포인터의 관계

문자열은 사실 문자에 대한 포인터입니다. 문자열의 이름은 그 첫 번째 문자를 가리키는 포인터입니다. 이러한 특성을 이용하면 포인터를 통해 문자열의 각 문자에 접근하고, 문자열을 다루는 다양한 방법을 사용할 수 있습니다.

 

[예제]

#include <stdio.h>

int main() {
    char str[] = "Hello"; // 문자열 "Hello"를 선언합니다.
    char *ptr = str; // 포인터 ptr에 str의 주소를 할당합니다.
    
    while(*ptr != '\0') { // ptr가 가리키는 문자가 NULL 문자가 아닐 때까지 반복합니다.
        printf("%c ", *ptr); // ptr이 가리키는 문자를 출력합니다.
        ptr++; // ptr을 다음 문자로 이동시킵니다.
    }

    return 0;
}

 

위 예제에서, 포인터 ptr은 문자열 str의 첫 번째 문자를 가리킵니다. *ptr로 포인터가 가리키는 문자에 접근하고, ptr++로 다음 문자로 이동합니다. 이렇게 포인터를 이용하여 문자열을 순회하는 방법을 보여줍니다.

 


10.7. 문자열을 사용한 프로그램 예제

문자열을 활용하는 간단한 프로그램을 제작하는 방법을 소개합니다. 문자열의 선언부터 초기화, 문자열 관련 함수의 활용, 포인터를 통한 문자열 처리 등, 지금까지 배운 모든 내용을 종합적으로 적용해 보는 기회입니다. 사용자의 입력을 받아 처리하거나, 파일에서 문자열을 읽어와 처리하는 등 다양한 실제적인 상황을 가정하여 효과적인 코드를 작성하는 방법을 배울 수 있습니다.

10.7.1. 단어 카운팅 프로그램 작성

이 부분에서는 문자열을 사용하여 특정 문자열에 포함된 단어의 수를 세는 프로그램을 작성해 보겠습니다. 아래는 C언어로 작성된 예제 코드입니다.

[예제]

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

int main() {
    char str[100];
    int count = 0, i;

    printf("Enter a sentence: ");
    fgets(str, sizeof(str), stdin);

    for(i = 0; str[i] != '\0'; i++) {
        // 단어는 공백, 개행 또는 널 문자로 구분됩니다.
        if(str[i] == ' ' || str[i] == '\n' || str[i] == '\0') {
            count++;
        }
    }

    printf("The number of words in the sentence is: %d\n", count);
    return 0;
}


이 프로그램은 사용자로부터 문장을 입력받고, 문장 내의 단어 수를 세어 출력합니다. 여기서는 공백, 개행, 또는 널 문자를 단어의 경계로 간주합니다.

 

10.7.2. 문자열 정렬 프로그램 작성

이번에는 문자열을 알파벳 순으로 정렬하는 프로그램을 작성해보겠습니다. 아래는 C++로 작성된 예제 코드입니다.

[예제]

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

int main() {
    std::vector<std::string> words;
    std::string word;

    std::cout << "Enter words (end with 'END'): ";

    while (std::cin >> word && word != "END") {
        words.push_back(word);
    }

    std::sort(words.begin(), words.end());

    std::cout << "Sorted words: ";
    for(const auto& w : words) {
        std::cout << w << " ";
    }

    return 0;
}

 

이 프로그램은 사용자로부터 "END"가 입력될 때까지 단어를 입력받습니다. 단어를 모두 입력받은 후, 알파벳 순으로 정렬하여 출력합니다.

 

이 두 예제는 문자열 처리에 관련된 기본적인 알고리즘을 구현한 것입니다. 문자열 처리는 다양한 프로그램에서 중요한 부분이므로 이런 예제들을 통해 문자열과 관련된 다양한 함수와 기법을 익혀두는 것이 좋습니다.

 


10.8. 문자열에 대한 고급 주제

문자열을 더 깊이 있게 이해하고 다루는 방법에 대해 배우는 장입니다. 여기서는 문자열의 동적 할당, C++의 std::string 클래스 사용 방법, 문자열 토큰화, 문자열에서의 포인터 연산 등, 보다 복잡한 주제들을 다룹니다. 이 과정을 통해 학습자는 문자열을 더욱 효과적으로 활용하는 방법을 익힐 수 있습니다.

10.8.1. 동적 메모리 할당을 이용한 문자열 처리

문자열이 크거나 크기가 불확실한 경우, 동적 메모리 할당을 사용해 유연성을 확보할 수 있습니다. C에서는 malloc과 free, C++에서는 new와 delete를 사용해 메모리를 동적으로 할당하고 해제합니다.

 

예를 들어, 사용자로부터 입력받을 문자열의 크기를 알 수 없는 경우, 이를 동적 메모리 할당으로 처리할 수 있습니다.

 

[예제] C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char* str;
    str = (char*)malloc(100 * sizeof(char));  // 동적 메모리 할당
    strcpy(str, "Hello, World!");  // 문자열 복사
    printf("%s\n", str);  // 출력: Hello, World!
    free(str);  // 메모리 해제
    return 0;
}

 

[예제] C++

#include <iostream>
#include <cstring>

int main() {
    char* str = new char[100];  // 동적 메모리 할당
    strcpy(str, "Hello, World!");  // 문자열 복사
    std::cout << str << std::endl;  // 출력: Hello, World!
    delete[] str;  // 메모리 해제
    return 0;
}

 

10.8.2. 문자열의 다양한 응용

문자열은 프로그래밍에서 매우 자주 사용됩니다. 그러므로 문자열을 활용하는 다양한 방법을 알고 있으면 많은 도움이 됩니다. 예를 들어, 문자열 토큰화는 문자열을 여러 개의 서브스트링으로 나누는 과정입니다. C에서는 strtok 함수를 사용하여 문자열을 토큰화할 수 있습니다.

 

[예제] C

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

int main() {
    char str[100] = "Hello, World! Welcome to C programming.";
    char *token = strtok(str, " ");  // 첫 번째 토큰
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, " ");  // 다음 토큰
    }
    return 0;
}

 

C++에서는 stringstream 클래스를 사용하여 문자열을 토큰화할 수 있습니다.

 

[예제] C++

#include <iostream>
#include <sstream>

int main() {
    std::string str = "Hello, World! Welcome to C++ programming.";
    std::stringstream ss(str);
    std::string token;
    while (getline(ss, token, ' ')) {  // 공백을 기준으로 토큰화
        std::cout << token << std::endl;
    }
    return 0;
}

 

이러한 방법들을 이용하면 문자열 처리 작업을 더욱 효과적으로 수행할 수 있습니다.

 

 

 

2023.05.16 - [GD's IT Lectures : 기초부터 시리즈/C, C++ 기초부터 ~] - [C/C++ 프로그래밍] 9. 배열

 

[C/C++ 프로그래밍] 9. 배열

Chapter 9. 배열 배열의 개념, 선언, 초기화 및 사용법을 배웁니다. 인덱스와 반복문을 사용하여 배열을 효율적으로 처리하는 방법, 다차원 배열, 함수와 배열의 관계, 그리고 문자 및 동적 배열에

gdngy.tistory.com

 

반응형

댓글