Я новичок в C ++, у меня есть проект по созданию этой программы Address Book, и у меня проблемы с приведенным ниже кодом. Код предназначен для создания записей.

cin >> ch;
switch(ch)
{
    case '1':
        system("cls");
        cout << "\n\nINSERT RECORD";
                        cout << "\n\nInput FIRST NAME: ";
                        cin.ignore();
                        getline(cin,firstname,'\n');
                        cout << "\n\nInput LAST NAME: ";
                        getline(cin,lastname,'\n');
                        cout << "\n\nInput PHONE NUMBER: ";
                        getline(cin,phonenumber,'\n');
                        cout << "\n\nInput DAY OF BIRTH: ";
                        getline(cin,dayofbirth,'\n');
                        cout << "\n\nInput MONTH OF BIRTH: ";
                        getline(cin,monthofbirth,'\n');
                        cout << "\n\nInput YEAR OF BIRTH: ";
                        getline(cin,yearofbirth,'\n');
                        cout << "\n\nInput AGE: ";
                        getline(cin,age,'\n');
                        cout << "\n\nInput STREET NAME (Address): ";
                        getline(cin,streetname,'\n');
                        cout << "\n\nInput CITY (Address): ";
                        getline(cin,city,'\n');
                        cout << "\n\nInput STATE (Address): ";
                        getline(cin,state,'\n');
                        cout << "\n\nInput ZIP CODE (Address): ";
                        getline(cin,zipcode,'\n');
                        cout << "\nRecord inserted!";
                    current = ad.AddNode(temp);
            ad.userPromptStatement();
    break;


    node* AddressBook::AddNode(nodePtr temp)
    { 
        string firstname;
        string lastname;
        string phonenumber;
        string dayofbirth;
        string monthofbirth;
        string yearofbirth;
        string age;
        string streetname;
        string city;
        string state;
        string zipcode;
        AddressBook ad;

           if(head != NULL)
            {
                current = head;
                while(current -> next != NULL)
                {
                    current = current -> next;
                }
                current = new node;
                current -> next -> firstname = temp -> firstname;
                current -> next -> lastname = temp -> lastname;
                current -> next -> phonenumber = temp -> phonenumber;
                current -> next -> dayofbirth = temp -> dayofbirth;
                current -> next -> monthofbirth = temp -> monthofbirth;
                current -> next -> yearofbirth = temp -> yearofbirth;
                current -> next -> age = temp -> age;
                current -> next -> streetname = temp -> streetname;
                current -> next -> city = temp -> city;
                current -> next -> state = temp -> state;
                current -> next -> zipcode = temp -> zipcode;
                current -> next = nullptr;
                return current;
                ad.userPromptStatement();
            }
           else
            {
                head = new node;
                head -> firstname = temp -> firstname;
                head -> lastname = temp -> lastname;
                head -> phonenumber = temp -> phonenumber;
                head -> dayofbirth = temp -> dayofbirth;
                head -> monthofbirth = temp -> monthofbirth;
                head -> yearofbirth = temp -> yearofbirth;
                head -> age = temp -> age;
                head -> streetname = temp -> streetname;
                head -> city = temp -> city;
                head -> state = temp -> state;
                head -> zipcode = temp -> zipcode;
                head -> next = nullptr;
                return current;
            }
    }

Я все время получаю ошибку в "xstring".

Когда я создаю 1 запись, ошибки не возникает, но когда я создаю вторую, я получаю следующее: «Необработанное исключение по адресу 0x00934ABB в dummy3.exe: 0xC0000005: место чтения нарушения прав доступа 0xCDCDCDE5».

bool _Grow(size_type _Newsize,
    bool _Trim = false)
    {   // ensure buffer is big enough, trim to size if _Trim is true
    if (max_size() < _Newsize)
        _Xlen();    // result too long
    if (this->_Myres < _Newsize) /*** <- next statement that will be executed points to this line ***/
        _Copy(_Newsize, this->_Mysize); // reallocate to grow
    else if (_Trim && _Newsize < this->_BUF_SIZE)
        _Tidy(true, // copy and deallocate if trimming to small string
            _Newsize < this->_Mysize ? _Newsize : this->_Mysize);
    else if (_Newsize == 0)
        _Eos(0);    // new size is zero, just null terminate
    return (0 < _Newsize);  // return true only if more work to do
    }

Любые идеи? Я ничего не знаю о части "xstring" ..

0
user3391677 7 Мар 2014 в 13:10

2 ответа

Лучший ответ

Ваша проблема здесь:

current = new node;
current -> next -> firstname = temp -> firstname;

Вы только что создали новый узел (заменив текущий), а затем пытаетесь получить доступ к его дочернему (следующему), который не инициализирован.

Это должно быть лучше:

current -> next = new node;
current -> next -> firstname = temp -> firstname;
...
current -> next -> next = nullptr;
return current -> next;

Еще один совет: если tmp создается динамически, подумайте о том, чтобы использовать его напрямую, а не копировать его элементы. Как это:

current -> next = tmp;

Я не знаю весь ваш код, поэтому не могу сказать, работает ли он для вас.

1
Mike de Dood 7 Мар 2014 в 09:44

Вероятно, причиной этой ошибки является попытка доступа к нулевому указателю.

Перед использованием необходимо создать temp . Я не видел ни одного указателя с именем temp. Сначала создайте temp и разместите его в памяти с помощью malloc или memset. Тогда вы можете передать ошибку.

0
Cracker 7 Мар 2014 в 09:18