Сбои программы, когда я пытаюсь сравнить две строки в C ++? - PullRequest
1 голос
/ 07 декабря 2011
int removeContact(Contact *newPtr, int runningTotal)
{
    //define variables
    string remove;
    int next;

    //prompt user for name they wish to remove
    cout << "Enter the name you would like to delete (Last name first): ";
    cin.ignore();
    getline(cin, remove);

    for (int t=0; t<=runningTotal; t++)
    {   
        if (remove.compare(newPtr[t].name) == 0)  
        {

            //calls function moveArrayElements function
            moveArrayElements(newPtr, runningTotal, t);

            //decrement runningTotal
            runningTotal--;

            //prompt user contact was found
            cout << "Contact was found and deleted!";

            next=1;
        }   

}

if(next!=1)
{
   cout<< "ERROR: Contact was not found!"; 
}

return runningTotal;
}

Эта функция является частью более крупной программы на С ++, которая предназначена для управления контактной информацией людей.Предполагается, что эта функция удаляет контакт.

У меня проблема с оператором if (remove.compare(newPtr[t].name) == 0).Когда моя программа попадает в эту часть кода, она падает без каких-либо ошибок.Я попытался сравнить обе строки с оператором ==, но это все равно приводит к сбою моей программы ...

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

Однако, когда я закрываю свою программу и загружаю свои контактные данные из текстового файла, моя программа аварийно завершает работу ... Я знаю, что моя программа считывает файл в правильный массив строк, потому что у меня есть печатьфункция, поэтому я знаю, что все мои контакты переносятся в правильные структурные массивы ...

Есть идеи, как я могу это исправить?Любая помощь будет оценена!Спасибо

ОБНОВЛЕНИЕ: Я принял предложения в комментариях и изменил цикл for на

t<runningTotal;

Однако, когда я делаю это, моя программа не падает, но она не сравнивает строки...

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Если runningTotal - размер вашего массива, то диапазон допустимых элементов - [0, runningTotal). В приведенном ниже коде вы выполняете цикл до runningTotal включительно , когда там нет действительного Contact объекта:

for (int t=0; t<=runningTotal; t++)
{   
    if (remove.compare(newPtr[t].name) == 0)

Поэтому, когда вы разыменуете newPtr[t] для t = runningTotal, а затем пытаетесь получить элемент name, вы будете вызывать неопределенное поведение и может вызвать сбой.

Попробуйте изменить t<=runningTotal на t < runningTotal, чтобы посмотреть, исчезнет ли проблема.

Кроме того, есть ли причина, по которой вы используете массивы, а не std::vector?

1 голос
/ 07 декабря 2011

Я предполагаю, что оператор for должен быть:

for (int t=0; t<runningTotal; t++) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...