�와 스� 처리 ��요...
여기서 ì�˜ë¬¸ì �ì�€ stringí—¤ë�” 파ì�¼ì�„ include하지 ì•Šê³ ë°°ì—´ì�„ char *형으로 í•˜ê³ #1,#2,#3ì�„ strcpy를 사용하여 ê³ ì¹˜ê³ ì‹¤í–‰í•œ 후,
처ì�Œì—� "empty"로 초기화 하거나 PUSH를 í• ë•Œ, ë°°ì—´ì�˜ ëª¨ë“ ê°’ì�´ 한개ì�˜ 값으로 변경ë�œë‹¤ëŠ” ì � 입니다...ì•„ì§�ë�„ ê·¸ ì�´ìœ 를 ëª¨ë¥´ê³ ìžˆì�Œ..
처ì�Œì—� "empty"로 초기화 하거나 PUSH를 í• ë•Œ, ë°°ì—´ì�˜ ëª¨ë“ ê°’ì�´ 한개ì�˜ 값으로 변경ë�œë‹¤ëŠ” ì � 입니다...ì•„ì§�ë�„ ê·¸ ì�´ìœ 를 ëª¨ë¥´ê³ ìžˆì�Œ..
AnswerMe 해당 코드를 ì˜¬ë ¤ì£¼ì„¸ìš”.#1, #2, #3 를 어떻게 바꾸시는지 ëª¨ë¥´ê² ìŠµë‹ˆë‹¤. ê·¸ë¦¬ê³ ì�´ 페ì�´ì§€ ì�´ë¦„ ì •ë¦¬ 해주세요.
~cpp #1 : strcpy(array[i], "empty"); #2 : strcpy(array[0], "empty"); #3 : strcpy(array[tail], "empty");가능하다면, ì „ì²´ 코드를 ì˜¬ë ¤ì£¼ì„¸ìš”. 지금 ì œ ìƒ�ê°�대로ë�¼ë©´, 불가능한 코드를 ë§�씀하시는 것 같아서요. --NeoCoin
ë¬¸ì œì�˜ ì „ì²´ 코드는 다ì�Œê³¼ 같습니다. --문ì›�명
ë°¤(10시 ì�´í›„)ì—� ë‹µë³€ë“œë¦¬ê² ìŠµë‹ˆë‹¤. ì €ì—�게는 ìƒ�당한 학습ì�˜ 기회가 ë� 것 같군요. 재미있네요. ì�¼ë‹¨, 글로 표현하기ì—� ìž�ì‹ ì�´ ì—†ê±°ë“ ìš”. 주변ì�˜ 사람들ì�„ ë¶™ìž¡ê³ ë¬¼ì–´ë³´ëŠ” 것ë�„ 좋ì�€ 방법ì�´ ë� 것 같습니다. ê·¸ë¦¬ê³ , í•™êµ� êµ�ì œì�˜, call By Value, call By reference 와 Pointer ê´€ë ¨ 부분ì�„ ì�½ìœ¼ì‹œë©´ ì¢‹ê² ìŠµë‹ˆë‹¤. --NeoCoin
설명� 복잡한것 같습니다. 안본셈 치세요 --;;
~cpp
#include <iostream>
#include <string>
using namespace std;
const int ASIZE = 5;
// VC++ 7.0 �서 컴파� 한 결과, 실행하면 디버그 모드�서 조차 실행�지 않습니다.
// VC++ 6.0 ��면, 아마 release 모드�서 실행� �지 않�것입니다.
void main()
{
std::string a;
char * array[ASIZE]; // Pointerì�˜ 배열입니다. 즉, 문ìž�를 ì €ìž¥í• ê³µê°„ì�€ 아닙니다.
// char 를 가리킬수 있는 주소를 ì €ìž¥í• ìˆ˜ 있는 32bit 값들ì�˜ Pointer들 5ê°œ
// 배열입니다.
// ê°� Pointer들ì�€ ì�˜ë¯¸ 없는 값들로 ì±„ì›Œì ¸ 있습니다.(컴파ì�¼ëŸ¬ ì�˜ì¡´)
int tail = 0, status = 3;
int select, count;
for(int i = 0 ; i < ASIZE ; i++)
strcpy(array[i], "empty"); // Pointerê°€ 가르키는 부분ì�´ 우연히 ì ‘ê·¼ 가능한 메모리 공간ì�´ë�¼ë©´
// ë�®ì–´ 씌ì›�니다. VC++ 6.0 Debug 모드ì—�서는 디버그 ì •ë³´ë¥¼ 위해서
// 코드 주변ì—� ì ‘ê·¼ 가능한 공간ì�„ ë‘�기 때문ì—� ì—�러가 ì—†ì�´ 넘어가는
// 것으로 보입니다. 경험ìƒ� debug 모드ì—�서는 ì–´ëŠ�ì •ë�„ 수용가능한
// 주소로 초기값� 세팅�어 있었습니다. Release 모드로 바꾸어서 컴파� 해보세요.
do
{
cout << "1. PUSH 2. Pop 3. Stack 4. Queue 5. Show 6. Exit" << endl;
cin >> select;
switch(select)
{
case 1 :
cout << "ìž…ë ¥ : ";
if (tail == ASIZE)
{
cout << "오버 플로우 입니다." << endl;
break;
}
cin >> array[tail]; // array[tail] ì�€ ì•„ì§�까지 ì�˜ë¯¸ì—†ëŠ” 메모리 ì˜�ì—ì�„ 가리키는
// 하나ì�˜ Pointer입니다. ê·¸ ì˜�ì—ì—� ìž„ì�˜ë¡œ 문ìž�를 채우는 것ì�´ë¯€ë¡œ
// ì•ˆì „ì�„ ë³´ìž¥í• ìˆ˜ 없습니다. ì ‘ê·¼ 가능한 메모리 ì˜�ì—ì�´ë�¼ë©´, ìž…ë ¥ ë°›ì�€ ë§Œí�¼
// �어 씌�니다.
tail++;
break;
case 2 :
if(status == 4) //�
{
strcpy(array[0], "empty");
tail--;
for(count = 0 ; count < tail ; count++)
array[count] = array[count+1]; // string� 경우와 달리, Pointer 값만 복사�니다.
// string ��면, call by value 로 class간
// ì‹¤ì œ 복사가 ì�´ë£¨ì–´ 집니다. 계ì†� ê°™ì�€ ê°’ì—� 세팅ë�˜ëŠ” ì�´ìœ 는
// ì�´ì½”드 때문입니다. ë°°ì—´ìƒ�ì�˜ ëª¨ë“ char í�¬ì�¸í„°ê°€ ê²°êµ ê°™ì�€ ê³³ì�„ 가리키게 ë�©ë‹ˆë‹¤.
// 그래서 종반�는 한곳� 바꾸면 모�가 바�니다.
}
else //스�
{
tail--;
strcpy(array[tail], "empty"); // 위ì�˜ ì�´ìœ 로, ì—시 ì�˜ë¯¸ì—†ëŠ” ì˜�ì—ì—� 대한 복사 입니다.
}
break;
case 3 :
status = 3;
break;
case 4 :
status = 4;
break;
case 5 :
for(count = 0 ; count < tail ; count++)
{
cout << array[count] << "] "; // ì—시, ì�˜ë¯¸ì—†ëŠ” ì˜�ì—ì�„ 가리키는 Pointer를 ì¶œë ¥í•˜ë ¤ëŠ” 시ë�„
// 입니다. 앞서, empty+null ��는 값� 메모리� 억지로
// ì”Œì› ê¸° 때문ì—�, ê°’ì�´ ì¶œë ¥ ë� 수 있습니다.
}
cout << endl;
break;
case 6 :
break;
default :
cout << " 1부터 6까지ì�˜ 수를 ìž…ë ¥í•˜ì„¸ìš” " << endl;
}
}while(select != 6);
}
ìž…ë ¥ ê´€ë ¨ 설명, cinì�„ 통한
~cpp std:stringì—� ìž…ë ¥ê³¼, char* ì—� ìž…ë ¥ì‹œ ì°¨ì�´cin ì�´ stringì�„ ìž…ë ¥ 받는 코드는
처�� ��한 string 배열 코드는 다�과 �미가 같습니다.
~cpp C:\Program Files\Microsoft Visual Studio\VC98\Include\istream ì—� ì •ì�˜ ë�˜ì–´ 있습니다. ê¶�금하시면, Debug 모드로 ë”°ë�¼ê°€ 보세요.처ì�Œì—� ì�˜ë�„한 string ë°°ì—´ 코드는 다ì�Œê³¼ ì�˜ë¯¸ê°€ 같습니다.
~cpp string element; cin >> elementì�´ 코드중 >> 는, stringì—� ì •ì�˜ë�œ 코드를 조금 뜯어 ë³´ë©´, 종단ì—� 다ì�Œê³¼ ê°™ì�€ 코드를 수행합니다. í•„ìš” 부분ì�„ 발췌하였습니다.
~cpp
... �략 ...
if (_Ok) // ìž…ë ¥ì�´ 종료ë�˜ì—ˆë‚˜ìš”? 기본ì �으로 enter, space 기준 종료
{ // state okay, extract characters
...�략...
_Str.erase(); // ì €ìž¥í• string 공간 초기화 위ì—�서 element
_TRY_IO_BEGIN // 예외 처리 시작
/// ìž…ë ¥ë°›ì�„ 문ìž�ì—´ì�˜ 길ì�´ ì•Œì•„ë‚´ê³ , ì €ìž¥ 공간 준비
_Mysizt _Size = 0 < _Istr.width()
&& (_Mysizt)_Istr.width() < _Str.max_size()
? (_Mysizt)_Istr.width() : _Str.max_size();
...�략...
/// 순회하면서, 문�를 string� �하는 작업
for (; 0 < _Size; --_Size, _Meta = _Istr.rdbuf()->snextc())
...�략...
_Str.append(1, _Traits::to_char_type(_Meta)); // 문�를 하나씩 �한다. �때, string �체가
// 스스로 메모리를 í• ë‹¹í•©ë‹ˆë‹¤.
...�략...
그러나, 다ì�Œê³¼ ê°™ì�€ 코드~cpp char* element; cin >> element;는 종단ì�˜ ìž…ë ¥ê°’ì�„ 세팅하는 코드가 다ì�Œê³¼ 같습니다. 위와 ê±°ì�˜ ë�™ì�¼í•œ ê³¼ì •ì�„ 거칩니다.
~cpp
...�략...
*_Str++ = _Traits::to_char_type(_Meta); // _Str ì�€ 위ì�˜ char* 형ì�¸ element 입니다. 즉, 문ìž�를 ì €ìž¥í•˜ëŠ” 공간ì�„ í• ë‹¹í•˜ëŠ” 코드가 없습니다.
// 그래서, elementê°€ 가리키는 알수 없는 ê³³ì—� ê°’ì�„ ì €ìž¥í•˜ë ¤ê³ í•©ë‹ˆë‹¤.
// 만약 그공간ì�´ OSì�˜ 보호아래 현재 프로그램ì�´ ì ‘ê·¼í• ìˆ˜ 없는 ì˜�ì—ì�´ë�¼ë©´,
// 프로그램� 죽습니다.
...�략...
ì�´ 페ì�´ì§€ ì�´ë¦„ ì •ë¦¬ 어떻게 해야하는지 잘 ëª¨ë¥´ê² ì–´ìš”..ì�´ê³³ì�„ ì§€ìš°ê³ íŽ˜ì�´ì§€ë¥¼ 새로 만들어야 하나요?
DeleteMe 질문� ��� �가지� �미를 담�수 있습니다.
ê·¸ë¦¬ê³ ìœ„í‚¤ì�˜ 사용 방법ì�´ë‚˜, ì² í•™ë“¤ì�„ ë�„움ë§�ì�„ 기ì �으로 ë”°ë�¼ê°€ì„œ ì�½ì–´ë³´ì‹œë©´ 알수 있습니다. 그러나 단발성 게시íŒ�ì—� ì�µìˆ™í•œ ë§Žì�€ 분들ì�´ ì�Ÿì•„지는 ì •ë³´ì—� ë‘�드러기가 ë‚ ì§€ë�„ ëª¨ë¥´ê² êµ°ìš”. ^^;; 위는 그중 필요한 ë§�í�¬ 입니다. --NeoCoin- 페ì�´ì§€ì�´ë¦„ê³ ì¹˜ê¸° 방법
- 현 페ì�´ì§€ì�´ë¦„ ìž�ì²´ì—� 대한 ê³ ë¯¼
ps. 초반ì—� ë�°ë¸”스 ìº í”„ë¥¼ 대비한 ZeroWikiì�˜ 사용 방법ì—� 대한 ì •ì±…ì�´ 부재했ë�˜ê²ƒ 같습니다. 하지만, ì�´ ìž�ì²´ê°€ ì¦�ê±°ìš´ 학습ì�˜ 기회가 ë� 수 있ì�„ 것 같습니다.
~cpp
#include <iostream>
#include <string>
using namespace std;
const int ASIZE = 5;
void main()
{
string array[ASIZE];
int tail = 0, status = 3;
int select, count;
for(int i = 0 ; i < ASIZE ; i++)
array[i] = "empty"; //#1
do
{
cout << "1. PUSH 2. Pop 3. Stack 4. Queue 5. Show 6. Exit" << endl;
cin >> select;
switch(select)
{
case 1 :
cout << "ìž…ë ¥ : ";
if (tail == ASIZE)
{
cout << "오버 플로우 입니다." << endl;
break;
}
cin >> array[tail];
tail++;
break;
case 2 :
if(status == 4) //�
{
array[0] = "empty"; //#2
tail--;
for(count = 0 ; count < tail ; count++)
array[count] = array[count+1];
}
else //스�
{
tail--;
array[tail] = "empty"; //#3
}
break;
case 3 :
status = 3;
break;
case 4 :
status = 4;
break;
case 5 :
for(count = 0 ; count < tail ; count++)
{
cout << array[count] << "]\t";
}
cout << endl;
break;
case 6 :
break;
default :
cout << " 1부터 6까지ì�˜ 수를 ìž…ë ¥í•˜ì„¸ìš” " << endl;
}
}while(select != 6);
}










