U E D R , A S I H C RSS

�와 스�/문�명

�와 스� 처리 ��요...

여기서 �문�� string헤� 파�� include하지 않고 배열� char *형으로 하고 #1,#2,#3� strcpy를 사용하여 고치고 실행한 후,
처�� "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� 입력 받는 코드는 ~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 질문� ��� �가지� �미를 담�수 있습니다.
  1. 페�지�름고치기 방법
  2. 현 페�지�름 �체� 대한 고민

� �� 모� 어� 정� �움� �다고 ��합니다. 근처� 선배들�게 물어보세요. 서로 고민하면서, 좋� 페�지 구조를 만들어 보세요. � �체가 프로그래�� 과정과 별다를 것� 없습니다.

그리고 위키� 사용 방법�나, 철학들� �움�� 기�으로 따�가서 �어보시면 알수 있습니다. 그러나 단발성 게시�� �숙한 많� 분들� �아지는 정보� �드러기가 날지� 모르겠군요. ^^;; 위는 그중 필요한 �� 입니다. --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);
}



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:19
Processing time 0.0092 sec