새소식

CS/OS

시스템 프로그래밍 문자열 배열 new할당 예제

  • -

14) [char pointer array, strcmp, new] Write a program that keeps reading strings and store them in a character pointer array. It stops when the user enters "end" and displays all strings entered so far. Use "new" to allocate memory and use g++ to compile.

 

    Enter a string
     hi
     Enter a string
     aaa
     Enter a string
     bbb
     Enter a string
     end
     Strings entered so far are
     hi aaa bbb    

문제 해석: 아래는 입력한 문자열을 저장하기 위한 문자열 포인터 배열을 사용하여, 사용자가 "end"를 입력할 때까지 문자열을 계속 입력받고, 입력된 문자열을 출력하는 프로그램입니다. C++에서는 "new" 대신 "new[]" 연산자를 사용하여 배열 형태의 메모리를 동적으로 할당할 수 있습니다.

 

절차

1. 리눅스 환경에서 다음 명령어를 입력하여 "test.cpp" 파일을 생성합니다.

 

vi test.cpp

 

2. 아래 코드를 복사하여 "test.cpp" 파일에 붙여넣기 후, ":wq" 명령어로 저장 및 종료합니다.

#include <iostream>
#include <cstring>

using namespace std;

int main() {
    const int MAX_SIZE = 100;
    char* strArray[MAX_SIZE];  // 문자열 포인터 배열 선언
    int count = 0;

    while (true) {
        cout << "Enter a string: ";
        strArray[count] = new char[MAX_SIZE];
        cin >> strArray[count];

        if (strcmp(strArray[count], "end") == 0) {  // 문자열 비교
            break;
        }

        count++;
    }

    cout << "Strings entered so far are:" << endl;
    for (int i = 0; i < count; i++) {
        cout << strArray[i] << " ";
        delete[] strArray[i];  // 동적으로 할당한 메모리 해제
    }

    return 0;
}
const int MAX_SIZE = 100; //최대 문자열 길이를 상수로 정의합니다.
char* strArray[MAX_SIZE]; // 문자열 포인터 배열을 선언합니다.
배열의 크기는 MAX_SIZE로 지정합니다.
strArray[count] = new char[MAX_SIZE]; // 문자열 포인터 배열에서 count 인덱스에 동적으로 문자열 배열을 생성합니다. 할당된 메모리는 strArray[count]에 저장됩니다.
cin >> strArray[count]; // 사용자로부터 문자열을 입력받습니다.
strcmp(strArray[count], "end") == 0: //strcmp 함수를 사용하여 strArray[count]와 "end" 문자열을 비교합니다. 만약 같으면 무한 루프를 종료합니다.
cout << strArray[i] << " "; // 입력된 문자열을 출력합니다.
delete[] strArray[i]; //동적으로 할당한 메모리를 해제합니다.
new[]와 delete[] 연산자를 사용하여 동적으로 할당한 배열의 메모리를 해제해야 합니다.

 

 

3. 다음 명령어를 입력하여 g++ 컴파일러를 사용하여 "test.cpp" 파일을 컴파일합니다.

g++ -o test test.cpp

4. 다음 명령어를 입력하여 "test" 프로그램을 실행합니다.

./test

 5. 프로그램 실행 결과는 다음과 같습니다.

Enter a string: hi
Enter a string: aaa
Enter a string: bbb
Enter a string: end
Strings entered so far are:
hi aaa bbb

 

궁금한점

 

int count = 0;을 선언하고 strArray[count] = new char[MAX_SIZE]; 라고 하는 이유는 뭐야?

>> count 변수는 현재까지 입력된 문자열의 개수를 저장하는 변수입니다. 이 변수를 사용하여 문자열 포인터 배열 strArray의 다음 인덱스에 새로운 문자열을 저장하고, 입력된 문자열의 개수를 하나 증가시킵니다.

strArray[count] = new char[MAX_SIZE];는 문자열 포인터 배열 strArray에서 count 인덱스에 대해 동적으로 문자열 배열을 할당하는 코드입니다. new 연산자를 사용하여 char 타입의 배열을 동적으로 할당하고, 해당 배열의 주소를 strArray[count]에 저장합니다.

이 코드는 입력된 문자열이 새로운 인덱스에 저장될 때마다 count를 증가시켜야 하므로, count 변수를 사용하여 strArray 배열의 새로운 인덱스를 가리키도록 합니다.

 

strArray[count] = new char[MAX_SIZE]; 에서, while문을 돌면서 인덱스 하나하나마다, new로 400만큼의 메모리공간을 할당받는 이유는 뭐야?

>>strArray[count] = new char[MAX_SIZE];는 문자열 포인터 배열 strArray의 count 인덱스에 대해 동적으로 문자열 배열을 할당하는 코드입니다. 이 코드에서 MAX_SIZE는 문자열 배열의 크기를 나타내며, 이 값은 프로그램에서 최대 문자열 길이를 나타냅니다.

따라서 while문을 돌면서 strArray의 각 인덱스마다 MAX_SIZE 크기의 메모리 공간을 할당하는 것은, 프로그램에서 입력받을 수 있는 문자열의 최대 길이를 미리 정해놓고 해당 길이보다 긴 문자열은 입력받을 수 없도록 제한하기 위함입니다.

이렇게 문자열의 최대 길이를 제한하는 것은 프로그램에서 메모리 사용량을 제한하고, 예상치 못한 오류를 방지할 수 있습니다. 예를 들어, 메모리를 동적으로 할당할 때 할당할 수 있는 메모리의 양이 제한되어 있기 때문에, 너무 큰 문자열을 입력하면 메모리 할당이 실패할 수 있습니다. 이러한 경우 프로그램은 비정상적으로 종료될 수 있습니다.

 

그럼 , strArray[count] = new char[MAX_SIZE]; 로 인해서 cin >> strArray[count]; 이 코드로 문자열을 입력받을 때, 최대 400만큼의 메모리공간을 차지할 정도의 문자열만 입력받을 수 있는거야?

>>네, 맞습니다. strArray[count] = new char[MAX_SIZE];로 할당된 메모리 공간은 MAX_SIZE로 지정되어 있습니다. 따라서 cin >> strArray[count];로 입력받을 수 있는 문자열의 최대 길이도 MAX_SIZE로 제한됩니다.

하지만 이는 최대 길이로 제한되는 것이며, 실제로 입력되는 문자열은 이보다 짧을 수도 있습니다. 따라서 입력받은 문자열의 길이가 MAX_SIZE를 초과할 경우 문자열의 일부가 잘려나가게 됩니다.

또한, 이 코드에서는 strArray의 크기가 동적으로 할당되기 때문에, 실제 메모리 사용량은 입력받은 문자열의 크기에 따라 달라질 수 있습니다. 따라서 이 코드에서는 최대 길이가 MAX_SIZE인 문자열을 입력받을 수 있지만, 입력받은 문자열의 길이에 따라 실제 사용되는 메모리 크기는 달라질 수 있습니다.

'CS > OS' 카테고리의 다른 글

[webOS] webOS란 무엇인가?  (0) 2024.06.23
프로세스(Process) 와 쓰레드(Thread) 정리  (0) 2024.06.22
시스템프로그래밍 1주차  (0) 2023.03.09
[1week]Linux commands  (0) 2023.02.27
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.