2012-05-25 2 views
1
int client::add_user(item & item_in) 
{ 
    char temp[ASIZE]; 
    cout << "\n\nEnter the name of your item: "; 
    cin.get(temp, 100, '\n'); 
    cin.ignore(100, '\n'); 
    get_upper(temp); 
    item_in.name = temp; 

    cout << "\n\nEnter in effect one: "; 
    cin.get(temp, 100, '\n'); 
    cin.ignore(100, '\n'); 
    get_upper(temp); 
    item_in.effect1 = temp; 

    cout << "\n\nEnter in effect two: "; 
    cin.get(temp, 100, '\n'); 
    cin.ignore(100, '\n'); 
    get_upper(temp); 
    item_in.effect2 = temp; 

    cout << "\n\nEnter in effect three: "; 
    cin.get(temp, 100, '\n'); 
    cin.ignore(100, '\n'); 
    get_upper(temp); 
    item_in.effect3 = temp; 

    cout << "\n\nEnter in effect four: "; 
    cin.get(temp, 100, '\n'); 

    cout << "this"; 
    cin.ignore(100, '\n'); 
    cout << "that"; 

    get_upper(temp); 
    item_in.effect4 = temp; 

...이 코드 문제가 많이있다 확신 이해, 내가 데 문제가 처음 네 개의 블록이 잘 실행되지만이다 나는 g ++를 사용하여이 코드를 컴파일하고 실행하면, " 세그먼트 표시 오류가 표시되고 "그"가 표시됩니다. 어떤 아이디어?C++ cin.ignore가 seg 오류를 일으 킵니까?

+0

'정의'의 정의는 무엇입니까? –

+0

@JoachimPileborg const int ASIZE = 30; – Flexo1515

+0

입력이 29 자보다 길습니까? 이 경우 스택을 덮어 쓰면 설명 할 수없는 오류가 발생할 수 있습니다. –

답변

3

다른 질문에 따라 item_in은 여러 개의 char * 필드가있는 구조체 인 것 같습니다. 배열 temp은이 기능이 지속되는 동안에 만 존재하기 때문에 심각한 문제가 있습니다. 임시 배열의 주소를 포인터 item_in에 할당합니다. 함수가 돌아 오면 배열이 범위를 벗어나서 메모리가 더 이상 자신의 것이 아닙니다.

당신은 포인터에 메모리를 할당하고 데이터를 복사하여이 문제를 해결할 수 있지만, 최고의 솔루션은 C++ 표준 라이브러리에서 std::string을 사용하는 것입니다. 예상대로 자원 관리 및 할당 작업과 같은 작업을 처리합니다.

+0

문자열을 사용할 수 없습니다 :(. 그냥 중개자를 사용하는 대신 값을 구조체에 직접 할당했습니다. – Flexo1515

관련 문제