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인 문자열을 입력받을 수 있지만, 입력받은 문자열의 길이에 따라 실제 사용되는 메모리 크기는 달라질 수 있습니다.