C ++ программа перестает работать во время работы - PullRequest
0 голосов
/ 08 мая 2018

Пожалуйста, помогите решить эту проблему. Это простая программа структуры данных В этой программе сначала пользователь вводит, сколько записей он хочет ввести, затем он вводит запись. После ввода записи он вводит данные для поиска и поиска. Теперь я делаю только один вход для поиска №2. после этого я сделаю другие. когда я запускаю его и включаю функцию поиска, он перестает работать и закрывается с ошибкой Windows.

enter image description here Во-вторых, при первом вводе данных он не принимает ввод для имени при первом запуске цикла, чем ввод для имени.

enter image description here

Пожалуйста, помогите спасибо заранее.

#include<conio.h>
#include<iostream>
#include<fstream>
#include<Windows.h>
#include<dos.h>
#include<cctype>
#include<sstream>
#include<string>

using namespace std;

bool check = true;
struct node    //structure of node //
{
    char name[20];
    char ccode[20];
    int marks;
    float cgpa;
    node *next;
}*head,*lastptr;

void add()    //Adds record of student//
{
    node *p;
    p=new node;
    cout<<"Enter name of student:"<<endl;
    gets(p->name);
    fflush(stdin);
    cout<<"Enter cource code:"<<endl;
    gets(p->ccode);
    fflush(stdin);
    cout<<"Enter Marks of student:"<<endl;
    cin>>p->marks;
    fflush(stdin);
    cout<<"Enter CGPA of student:"<<endl;
    cin>>p->cgpa;
    fflush(stdin);
    p->next=NULL;

    if(check)
    {
        head = p;
        lastptr = p;
        check = false;
    }
    else
    {
        lastptr->next=p;
        lastptr=p;
    }
    cout<<endl<<"Student's information saved Successfully";
    getch();
}

void search()   //searches record of student//
{
    node *prev=NULL;
    node *current=NULL;
    char c_code[20];
    cout<<"Enter Roll Number to search:"<<endl;
    //c_code=getch();
    gets(c_code);
    fflush(stdin);
    cout<<"hkjhk"<<c_code;
    prev=head;
    current=head;
    while(current->ccode!=c_code)
    {
        prev=current;
        current=current->next;
    }
    cout<<"\nname: ";
    puts(current->name);
    cout<<"\n Cource Code:";
    cout<<current->ccode;
    cout<<"\nMarks:";
    cout<<current->marks;
    cout<<"\nCGPA:";
    cout<<current->cgpa;
    getch();
}


int main()
{
    int x;
    system("cls");
    cout<<"How many students you want to enter"<<endl;
    cin>>x;
    while(x>0){
        add();
        x--;
    }

    cout<<"\nwhat type of search you want to search select choice 1 ,2 3 \n";
    int choice;
    cout<<"1 search all student by cource code \n";
    cout<<"2 search all student by marks \n";
    cout<<"3 search all student by cgpa \n"; 
    cin>>choice; 
    if(choice==1)
    {
        system("cls");
        add();
    }
    else if(choice==2)
    {
        cout<<"fhghgf";
        system("cls");
        search();
    }
    else
    {
    }
    getch();
}

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

GDB может быть полезным для получения ошибки. Запустите GDB и запустите вашу программу через консоль GDB, выполните те же действия в вашей программе, чтобы получить сбой, и после сбоя программы введите команду «bt», и она сообщит об отслеживании последних выполненных строк до сбоя, поэтому Вы сможете найти ошибку

0 голосов
/ 08 мая 2018

Одна из проблем в строке ниже:

while(current->ccode!=c_code)

Вам нужно будет использовать:

while (strcmp (current->ccode, c_code))
0 голосов
/ 08 мая 2018

В вашем search() методе есть цикл:

while(current->ccode!=c_code)
{
   prev=current;
   current=current->next;
}

что случилось, когда код не найден? Вы продолжаете после окончания связанного списка. Кроме того, вам нужно сравнить содержимое, а не адрес, поэтому вы должны использовать strcmp.

для решения проблемы должно быть:

while(current && strcmp (current->ccode, c_code))
{
   prev=current;
   current=current->next;
}

Другая проблема - это метод gets(). Вы должны fflush(stdin) ПЕРЕД gets(), в противном случае gets() будет читать только неотредурованный CR предыдущего ввода (конец строки).

если вы хотите вместо fflush(stdin), вы можете использовать метод eatwhites, например:

istream& eatwhites(istream& stream)
{
    // to define white spaces manually:
    //const string skip=" \t\r\n";
    //while(string::npos != skip.find(stream.peek())){
    //   stream.ignore();
    //}

    //or just use isspace:
    while(isspace(stream.peek())){
        stream.ignore();
    }
    return stream;
}

и позвоните до gets(): eatwhites(stdin); Этот метод пропускает белые символы и помещает чтение в начало данных, чтобы вы не читали пустую строку, оставленную предыдущим вводом ...

Другое дело: лучше использовать std::getline(); и работать с std::string вместо массивов символов.

...