【问题标题】:`iqueue->front` is displaying proper value and is not null.But tempiq is showing NULL and gives segmentation fault.Why?`iqueue->front` 显示正确的值并且不为空。但是 tempiq 显示为 NULL 并给出分段错误。为什么?
【发布时间】:2016-09-16 15:57:06
【问题描述】:

代码中的while 循环给出了分段错误(因为tempiq 为NULL)。我不明白为什么当queue->front 显示正确的值并且不为null 时tempiq 为NULL(肯定) .

        //......previous code

        tempiq=iqueue->front;
        cout<<"\n"<<iqueue->front->link<<""<<iqueue->front;
        if(tempiq)// && iqueue->front)
        cout<<"\n aaaaaaaaaaaaaaaaaaaa\t";
        while(tempiq)
        {
        //....rest of code

完整代码参考如下:(以上代码段在main函数最后)

    #include <vector>
    #include <iostream>
    #include <string.h>
    #include <fstream>
    #include <stdio.h>
    #include <termios.h>
    #include <sstream>
    #include <unistd.h>
    #include <cstdlib>
    #include <ctype.h>
    using namespace std;
    #define NO_OF_CHARS 256

    /* This function builds the TF table which represents Finite Automata for a
       given pattern  */
    void computeTransFun(char *pat, int M, int TF[][NO_OF_CHARS])
    {
        int i, lps = 0, x;

        // Fill entries in first row
        for (x =0; x < NO_OF_CHARS; x++)
           TF[0][x] = 0;
        TF[0][pat[0]] = 1;

        // Fill entries in other rows
        for (i = 1; i<= M; i++)
        {
            // Copy values from row at index lps
            for (x = 0; x < NO_OF_CHARS; x++)
                TF[i][x] = TF[lps][x];

            // Update the entry corresponding to this character
            TF[i][pat[i]] = i + 1;

            // Update lps for next row to be filled
            if (i < M)
              lps = TF[lps][pat[i]];
        }
    }

    /* Prints all occurrences of pat in txt */
    int searchauto(char *pat, char *txt)
    {
        int M = strlen(pat);
        int N = strlen(txt);

        int TF[M+1][NO_OF_CHARS];

        computeTransFun(pat, M, TF);
     int flag=0;
        // process text over FA.
        int i, j=0;
        for (i = 0; i < N; i++)
        {
           j = TF[j][txt[i]];
           if (j == M)
           {
            return flag;
             //printf ("\n pattern found at index %d", i-M+1);
           }
        }
        return flag;
    }
    class Node
    {
      char content;
      bool marker;
      vector <Node*>children;

      public:
      Node(){ content='\0'; marker=false; }
      ~Node(){}

      void setContent(char c){content=c;  }
      void setMarker(){this->marker=true; }
      char getContent(){return content; }
      bool getMarker(){return marker;  }

      Node *findChild(char c);

      void appendChild(Node *child)       
      { children.push_back(child);   }

      vector<Node *> getChildren()
      { return children;    }


    };

    class Trie
    {
        public:
        Node *root;

        int abc;
        void addWord(string s);
        void deleteWord(string s);
        bool searchWord(string s);

        Trie(){   root=new Node();  }
        ~Trie(){}



    };


    Node *Node::findChild(char c)
    {
        for(int i=0; i< children.size(); i++)
        {
          Node *temp=children.at(i);

          if(temp->content==c)
                return temp;
        }
        return NULL;
    }

    void Trie:: addWord(string s)
    {
        //cout<<"\naddword called for "<<s<<"::::::::::::::::::::::::\n";
        Node *current=root;

        if(s.length()==0)
        {   cout<<"\txxxx\t";  current->setMarker(); return ; }

        for(int i=0;i<s.length();i++)
        {
            Node *child=current->findChild(s[i]);
            if(child!=NULL)
                current=child;
            else
            {
                Node *tmp=new Node();
                tmp->setContent(s[i]);

                current->appendChild(tmp);
                current=tmp;
            }

            if(i==s.length()-1)
                current->setMarker();

            cout<<"\ttrying\t";
        }

        cout<<"\n word added\t";
    }


    bool Trie::searchWord(string s)
    {
        cout<<"\nsearchWord called for "<<s<<endl;
        Node *current=root;
        cout<<"\n search started\t";
        cout<<endl;
        while(current !=NULL)
        {
            cout<<"\t00\t";
            for(int i=0;i<s.length();i++)
            {
                cout<<s[i]<<" ";
            Node *temp=current->findChild(s[i]);
            if(temp==NULL)
                return false;

                current=temp;
            }
            cout<<endl;
            int a;
           // cin>>a;

            if(current->getMarker())
            {
                cout<<"String found......................................................................................................\n";
                return true;
            }
            else
            {
                cout<<"Sorry string not found in trie....................................................................................\n";
                return false;
            }

        }
    }

    struct node
    {
        struct node *next;
        int rank;
        int nopage;
        Trie *trie;
        string value;
    };
    struct indexqueue
    {
        struct indexnode *front;
        struct indexnode *rear;
    };
    struct indexqueue *createindexqueue()
    {
        struct indexqueue *temp=new indexqueue;
        temp->front=NULL;
        temp->rear=NULL;
        //temp->count=0;
        return temp;
    }
    struct indexnode
    {
        int id;
        int rank;
        int *point2[];
        string link;
        Trie *down;
        struct indexnode *next;
    };
    struct indexnode *createindexnode(string val)
    {
        struct indexnode *temp=new indexnode;
        temp->next=NULL;
        //temp->value=val;
        //cout<<"Node created with val: "<<val<<endl;   
        return temp;
    }
    struct indexqueue *iqueue;
    struct queue
    {
        struct node *front;
        struct node *rear;
        int count;
    };
    struct node *createnode(string val)
    {
        struct node *temp=new node;
        temp->next=NULL;
        temp->value=val;
        //cout<<"Node created with val: "<<val<<endl;   
        return temp;
    }
    struct queue *createqueue()
    {
        struct queue *temp=new queue;
        temp->front=NULL;
        temp->rear=NULL;
        temp->count=0;
        return temp;
    }
    struct queue *pop(struct queue *queue1)
    {
        struct node *temp=new node;
        if(queue1->front==NULL)
            return NULL;
        else if(queue1->front==queue1->rear)
        {
            queue1->front=NULL;
            queue1->rear=NULL;
        }
        else
        {
            queue1->front=queue1->front->next;
        }
        return queue1;
    }
    struct queue *push(string val, struct queue *queue1)
    {
        struct node *new1=createnode(val);
        if(queue1->front==NULL && queue1->rear==NULL)
        {
            queue1->front=queue1->rear=new node;
            queue1->rear=new1;
            queue1->front=new1;
            //cout<<"1\n";
        }
        else
        {
            queue1->rear->next=new node;
            queue1->rear->next=new1;
            queue1->rear=queue1->rear->next;
            //cout<<"2\n";
        }
        queue1->count++;
        return queue1;
    }

    void inserttrie(struct queue *queue1,string value,string collection[],int n)
    {
        struct node *temp=queue1->front;
        while(temp!=NULL)
        {
            if(temp->value.compare(value)==0)
            {
                temp->nopage=n;
                for(int i=0;i<n;i++)
                temp->trie->addWord(collection[i]);
            }
        }
    }
    void display(struct queue *queue1)
    {
        if(!queue1->front)
        {
            cout<<"Queue empty\n";
            return;
        }
        struct node *temp=queue1->front;
        while(temp)
        {
            cout<<temp->value<<"\n";
            temp=temp->next;
        }
    }
    void pushindex(struct indexnode *temp)
    {
        if(iqueue->front==NULL && iqueue->rear==NULL)
        {
            iqueue->front=temp;
            iqueue->rear=temp;
        }
        else 
        {
            iqueue->rear->next=temp;
            iqueue->rear=temp;
        }
    }
    int search(struct queue* queue1,string val)     //returns 1 if val found in queue1 else 0
    {
        if(queue1->front==NULL)
            return 0;
        struct node *temp=new node;
        temp=queue1->front;
        while(temp)
        {
            if(val.compare(temp->value)==0)
                return 1;
            temp=temp->next;
        }
        return 0;
    }
    int globalcounter=23456;
    struct queue *bot(struct queue *crawl,ifstream& infile,string text)
    {
        struct indexnode *newnode=new indexnode;
        //cout<<"\n"<<text<<"\toooooooooooo\n";
        newnode->link=text;
        newnode->down=new Trie;
        newnode->down->abc=globalcounter++;
        //cout<<"\n"<<newnode->link<<"\toooooooooooo\n";
        newnode->next=NULL;
        //indexnode->nop=0;
        //Trie *word=new Trie;
        if(infile==NULL)
            return NULL;
        cout<<"BOT_START\n";
        string line;
        string tri[10000];
        //char *v;
        string v;
        string mxy;
        int n=0;
        while(getline(infile,line))
        {
            string link="";
            cout<<"\n "<<line<<"\t\n";
            int i=0,flag=0,flag1=0,x=0,m=0;
            tri[x]="";
            for(i=0;i<line.length()-1;i++)
            {


                    if(line[i]==' '||line[i]=='*' && line[i+1]=='*'||line[i]=='*'||line[i]==';'||line[i]=='.'||line[i]=='/')
                    {
                        x++;
                        //tri[x-1][m]='\0';
                        //v+='\0';
                        //cout<<"\n***********************************************************"<<v<<endl;
                        cout<<"\n";
                        tri[x-1]=v;
                        newnode->down->addWord(v);
                        if(newnode->down->searchWord(v))
                            {
                                int a;
                                cout<<"HHHHHHHHHHHHHUUUUUUUUUUUUUUUUUUUUUURRRRRRRRRRRRRRRRRRRRRAAAAAAAAAAAAAYYYYYYYYYYYYYY\n";
                                cout<<newnode->down->abc<<endl;
                                //cin>>a;
                            }
                        mxy=v;
                        v="";
                        m=0;
                        //tri[x]="";


                    }
                else
                    {
                        v+=line[i];
                        //tri[x][m]=line[i];

                        cout<<" "<<tri[x][m++]<<" "<<line[i]<<" "<<v;

                    }
                    //cout<<"\t.....miiii...miiii....."<<tri[x]<<"      ";


                if(line[i]=='*' && line[i+1]=='*' && flag==0)
                {
                    flag=1;
                    i+=2;
                }
                if(line[i]=='*' && line[i+1]=='*' && flag==1)
                {
                    flag=0;
                    flag1=1;
                    i+=2;
                }
                if(flag==1 && flag1==0)
                {
                    link+=line[i];
                }
                if(flag1==1)
                {
                    link+='\0';
                    n++;
                    cout<<"\nLink:"<<link<<endl;
                    if(search(crawl,link)==0)
                    {
                        cout<<"Link not found in queue\n";
                        crawl=push(link,crawl);
                    }
                    else
                        cout<<"Link found in queue\n";
                    link="";
                    flag1=0;
                }

                //
                //
                //
                //

            }
        }
        int xt;
        //newnode->down=word;
        if(!newnode->down)
        {
            int a;
            cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
            //cin>>a;
        }
        //cout<<"````````````````````````` "<<newnode->down->abc;
        //int a;
        //cout<<newnode->down;
        //cin>>a;

        /*if(newnode->down->searchWord(" ")||newnode->down->searchWord("This")||newnode->down->searchWord(mxy))
        {
            int a;
            cout<<"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n";
            cin>>a;
            cin>>a;
        }*/
        //cout<<newnode->down->root->getMarker();
        //cin>>a;
        //cin>>xt;
        //displayIndexQueue();
        pushindex(newnode);
        infile.close();
        cout<<"BOT_END\n";
        return crawl;
    }
    struct queue *merge(struct queue *queue1,struct queue *queue2)
    {
        if(queue1->front==NULL)
            return queue2;
        else if(queue2->front==NULL)
            return queue1;
        else
        {
            struct node *temp=queue2->front;
            while(temp)
            {
                if(search(queue1,temp->value)==0)
                    queue1=push(temp->value,queue1);
                temp=temp->next;
            }
            /*queue1->rear->next=queue2->front;
            queue1->rear=queue1->rear->next;*/
            return queue1;
        }
    }
    /*struct queue *checkduplicate(struct queue *queue1,struct queue *queue2)
    {
        if(queue1->front==NULL || queue2->front==NULL)
            return NULL;
        struct queue *tempqueue=createqueue();
        struct node *temp=queue1->front;
        while(temp)
        {
            if(search(queue2,temp->value)==0)
            {
                tempqueue=push(temp->value,tempqueue);
            }
            temp=temp->next;
        }
        return tempqueue;
    }*/
    struct queue *spider(struct queue *crawl,ifstream& infile,string text)
    {
        struct queue *queue1=createqueue();
        if(infile==NULL)
            return NULL;
        queue1=bot(queue1,infile,text);
        if(queue1->front==NULL)         //check whether there are no links in the queue1
            return crawl;
        cout<<"SPIDER:Linked list returned by bot:\n";
        display(queue1);
        cout<<"\n";
        cout<<"SPIDER:Displaying crawl before merge:\n\n";
        display(crawl);
        crawl=merge(crawl,queue1);
        //queue1=checkduplicate(queue1,crawl);
        cout<<"SPIDER:Displaying crawl after merge:\n\n";
        display(crawl);
        cout<<"\n";
        struct node *temp=queue1->front;
        while(temp)
        {
            ifstream infile1;
            char *link=new char[((temp->value).length())+1];
            strcpy(link,(temp->value).c_str());
            infile1.open(link);
            cout<<"Spider is inside : "<<link<<endl;
            crawl=spider(crawl,infile1,string(link));
            temp=temp->next;
        }
        return crawl;
    }
    void displayIndexQueue()
    {
        if(iqueue->front==NULL)
        {
            cout<<"iqueue is empty----------------------------------------------\n";
            return;
        }
        struct indexnode *temp=iqueue->front;
        while(temp)
        {
            cout<<temp->link<<endl;
            //cout<<"6666666666666666666666666666666666666666666666666666666666666666666666\n";
            //if(temp->link=="/home/abhishek/Desktop/eco/testproject2_1_1.txt")
            //{
                if(temp->down->searchWord("this"))
                {
                    cout<<"this FOUND\n000000000000000000000000000=====================================================================000000000";
                }
                if(temp->down->searchWord("This"))
                {
                    cout<<"This FOUND\n000000000000000000000000000=====================================================================000000000";
                }
                if(temp->down->searchWord("movie"))
                {
                    cout<<"MOVIE FOUND\n000000000000000000000000000=====================================================================000000000";
                }
                cout<<"INSIDE IF OF displayIndexQueue\n";
            //cout<<endl<<temp->link<<" &&&&&&&&&&& ";
            temp=temp->next;
        }
    }
    struct user
    {
        string first_name;
        string last_name;
        int age;
        string email;
        string password;
    };
    struct user users[100];
    int globalcount;
    int validatename(string name)
    {
        int len=name.length(),flag=0,i=0;
        while(flag==0 && i<len)
        {
            if(!((name[i]>='a' && name[i]<='z') || (name[i]>='A' && name[i]<='Z')))
            {
                flag=1;
                break;
            }
            i++;
        }
        if(flag==0)
        {
            return 1;
        }
        else
        {
            return 0;
        }

    }
    int validateemail(string email)
    {
        if(!((email[0]>='a' && email[0]<='z') || (email[0]>='A' && email[0]<='Z')))
            return 0;
        int len=email.length();
        int a=0,b=0,c=0;
        for(int i=0;i<len;i++)
        {
            if(email[i]=='@')
                a=i;
            else if(email[i]=='.')
                b=i;
        }
        if(b<a+2)
            return 0;
        if(b==len-1 ||b==len-2)
            return 0;
        return 1;
    }
    int getch() {
        struct termios oldt, newt;
        int ch;
        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        ch = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
        fflush(stdin);
        return ch;
    }
    string inputpassword()
    {
        char password[100];
        for(int i=0;i<100;i++)
        {
            char ch;
            ch=getch();
            if(ch=='\n')
                break;
            password[i]=ch;
            cout<<"*";
        }
        return (string)password;
    }
    int validatepassword(string password)
    {
        int a=0,b=0,c=0,d=0;
        int len=password.length();
        if(len<6)
            return 0;
        for(int i=0;i<len;i++)
        {
            if(password[i]>='A' && password[i]<='Z')
                a++;
            else if(password[i]>='a' && password[i]<='z')
                b++;
            else if(password[i]>='0' && password[i]<='9')
                c++;
            else 
                d++;
        }
        if(a==0 || b==0 || c==0 || d==0)
            return 0;
        return 1;
    }
    string encrypt(string input)
    {
        int len=input.length();
        for(int i=0;i<len;i++)
        {
            if(i%2==0)
                input[i]=input[i]+5;
            else
                input[i]=input[i]-5;
        }
        return input;
    }
    string decrypt(string line)
    {
        int templ=line.length();
        int count_spaces=0,odd=0;
        for(int i=0;i<templ;i++)
        {
            if(line[i]==' ')
            {
                odd=-1;
                count_spaces++;
            }
            if(count_spaces==2)
            {
                if(line[i]!=' ')
                {
                    line[i]=line[i];
                }
            }
            else
            {
                if(line[i]!=' ')
                {
                    if(odd%2==0)
                        line[i]=line[i]-5;
                    else
                        line[i]=line[i]+5;
                }
            }
            odd++;
        }
        return line;
    }
    int checkexisting(string email)
    {
        cout<<"checkexisting called\n";
        for(int i=0;i<=globalcount;i++)
        {
            if(users[i].email.compare(email)==0)
            {
                cout<<"checkexisting returning 1\n";
                return 1;
            }
        }
        cout<<"checkexisting returning 0\n";
        return 0;
    }
    struct user *sign_up()
    {
        string first_name1,last_name1,email1,password1,password2;
        int age1;
        char test;
        cout<<"\nHere are a few syntax rules for signing up on Black Box:\n";
        cout<<"1.Age must not be less than 12 years.\n";
        cout<<"2.First name and Last name fields will accept only alphabets.\n";
        cout<<"3.email address must be of the form 'user@example.com'.\n";
        cout<<"4.Password must be at least 6 characters in length and must include at least one upper case";
        cout<<" alphabet,one lower case alphabet,one numeral and one special character.\n\n\n";
        cout<<"First Name: ";
        getline(cin,first_name1);
        while(validatename(first_name1)==0)
        {
            cout<<"Invalid first name entered.\n";
            cout<<"\nFirst name can have only alphabets(no spaces,no special characters and no numerals.\n";
            cout<<"Enter your first name again: ";
            getline(cin,first_name1);
        }
        cout<<"\nLast Name: ";
        getline(cin,last_name1);
        while(validatename(last_name1)==0)
        {
            cout<<"Invalid last name entered.\n";
            cout<<"\nLast name can have only alphabets(no spaces,no special characters and no numerals.\n";
            cout<<"Enter your last name again: ";
            getline(cin,last_name1);    
        }
        cout<<"\nAge: ";
        cin>>age1;
        if(age1<12)
        {
            cout<<"Sorry, but according to our TERMS OF USE, no user of age less than 12 can be allowed ";
            cout<<"to create an account on Black Box.\n";
            return NULL;
        }
        fflush(stdin);
        cin.ignore();
        cout<<"\nEmail address : ";
        getline(cin,email1);
        while(validateemail(email1)==0 || checkexisting(email1)==1)
        {
            if(validateemail(email1)==0)
            {
                cout<<"\nInvalid email entered.\n";
                cout<<"Email address can only be of the form abc@xyz.pqr.\n";
                cout<<"Enter the email address again: ";
            }
            if(checkexisting(email1)==1)
            {
                cout<<"\nEmail id already registered.\nChoose a new one.\n";
            }
            cout<<"\nEnter Email address again: ";
            getline(cin,email1);
        }
        cout<<"\nChoose a password: ";
        password1=inputpassword();
        cout<<"\nRetype Password: ";
        password2=inputpassword();
            while(validatepassword(password1)==0 || password1.compare(password2)!=0)
            {
                if(validatepassword(password1)==0)
                {
                    cout<<"Invalid password enterd.\n";
                    cout<<"Password must be at least 6 characters in length and must include at least";
                    cout<<" one upper case alphabet,one lower case alphabet,one numeral and one special character.\n";
                }
                if(password1.compare(password2)!=0)
                {
                    cout<<"\nPasswords do not match.\n";
                }
                cout<<"Enter the password again: ";
                password1=inputpassword();
                cout<<"\nRetype Password: ";
                password2=inputpassword();
            }
        struct user *newuser=new user;
        newuser->first_name=first_name1;
        newuser->last_name=last_name1;
        newuser->age=age1;
        newuser->email=email1;
        newuser->password=password1;
        ofstream outfile("userfile.txt",ios::app);
        if(outfile)
        {
            outfile<<encrypt(newuser->first_name)<<" "<<encrypt(newuser->last_name)<<" "<<newuser->age<<" "<<encrypt(newuser->email)<<" "<<encrypt(newuser->password)<<endl;
        }
        outfile.close();
        return newuser;
    }
    struct user extract(string line)
    {
        int len=line.length();
        int spaces=0;
        string first="",last="",age="",email="",password="";
        for(int i=0;i<len;i++)
        {
            if(line[i]==' ')
                spaces++;
            else
            {
                if(spaces==0)
                    first+=line[i];
                else if(spaces==1)
                    last+=line[i];
                else if(spaces==2)
                    age+=line[i];
                else if(spaces==3)
                    email+=line[i];
                else
                    password+=line[i];

            }
        }
        struct user newuser;
        newuser.first_name=first;
        newuser.last_name=last;
        stringstream convert(age);
        newuser.age=0;
        convert>>newuser.age;
        newuser.email=email;
        newuser.password=password;
        return newuser;
    }
    int loadusers()
    {
        string line;
        ifstream infile;
        infile.open("userfile.txt");
        if(!infile)
            return 0;
        while(getline(infile,line))
        {
            globalcount++;
            line=decrypt(line);
            users[globalcount]=extract(line);
        }
    }
    int login()
    {
        string email,password;
        char choice='y';
        while(choice=='y'||choice=='Y')
        {
            cout<<"\nEnter email address: ";
            cin>>email;
            cout<<"\nEnter password: ";
            cin>>password;
            int flag1=0,cur=-1;
            for(int i=0;i<=globalcount;i++)
            {
                if(email.compare(users[i].email)==0 && password.compare(users[i].password)==0)
                {
                    cur=i;
                    flag1=1;
                    break;
                }
            }
            if(flag1==1)
            {
                cout<<"Welcome "<<users[cur].first_name<<endl;
                break;
            }
            else
            {
                cout<<"Wanna try again?(y/n): ";
                cin>>choice;
            }
        }
        if(choice=='y'|| choice=='Y')
            return 1;
        else
            return 0;
    }
    int account_info()
    {
        int choice=0,m=1;
        cout<<"1.Sign up\n2.Log in\n3.Continue without an account\n4.Exit from Black Box.\nEnter your choice: ";
        cin>>choice;
        fflush(stdin);
        cin.ignore();
        struct user *new_user=NULL;
            switch(choice)
            {
                case 1:
                    new_user=new user;
                    new_user=sign_up();
                    if(new_user==NULL)
                    {
                        cout<<"Sign up failed.";
                        choice=3;
                    }
                    else
                    {
                        cout<<"Successful Sign up.\n";
                        ofstream outfile;
                        string newusernamefile="/home/aakash/project/users/"+encrypt(new_user->email)+".txt";
                        //char *newusernamefile1=newusernamefile.c_str();
                        outfile.open(newusernamefile.c_str());
                        outfile<<new_user->first_name;
                        outfile.close();
                        break;
                    }
                case 2:
                    if(login()==1)
                    {
                        cout<<"Successful login.\n";
                        break;
                    }
                    else
                    {
                        cout<<"Login failed.\n";
                        choice=3;
                    }
                case 3:
                    cout<<"Welcome to Black Box3.\n";
                    break;
                case 4:
                    exit(0);
                    break;
                default:
                    cout<<"Wrong choice.\n";
            };
            if(new_user)
            {
                cout<<"\nThe details entered are:\n";
                cout<<new_user->first_name<<endl;
                cout<<new_user->last_name<<endl;
                cout<<new_user->age<<endl;
                cout<<new_user->email<<endl;
                cout<<new_user->password;
            }
            cout<<endl<<endl;
        return 1;
    }
    void displayusers()
    {
        for(int i=0;i<=globalcount;i++)
        {
            cout<<"\n"<<users[i].first_name<<" "<<users[i].last_name<<" "<<users[i].age<<" "<<users[i].email<<" "<<users[i].password;
        }
        cout<<endl;
    }
    int main()
    {
        globalcount=-1;
        int temp1=loadusers();
        if(globalcount!=-1)
            displayusers();
        int temp=account_info();
        int a;
        //cin>>a;
        struct queue *crawl=createqueue();
        iqueue=new indexqueue;
        iqueue->front=NULL;
        iqueue->rear=NULL;
        string text;
        text="inputproject.txt";
        ifstream infile;
        infile.open("inputproject.txt");
        if(!infile)
        {
            cout<<"inputproject.txt not open\n";
            return 0;
        }
        else
            cout<<"inputproject.txt successfully opened\n";
        crawl=spider(crawl,infile,text);
        cout<<"Hey\n";
        if(crawl->front==NULL)
            return 1;
        cout<<"main:Displaying crawl\n";
        Trie *dummy=new Trie;
        dummy->addWord("movie");
        dummy->addWord("harry potter");
        dummy->addWord("rajnikanth");
        if(dummy->searchWord("movie"))
        {
            cout<<"MOVIE FOUND IN DUMMY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n";
        }
        if(dummy->searchWord("harry potter"))
        {
            cout<<"harry potter FOUND IN DUMMY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n";
        }
        if(dummy->searchWord("rajnikanth"))
        {
            cout<<"rajnikanth FOUND IN DUMMY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n";
        }
        cout<<iqueue->front->down;
        display(crawl);
        displayIndexQueue();
    string searchstring;
    cout<<"\n Enter the string you want to enter\t";
    getline(cin,searchstring);

    string arraystring[20];int m=0,n=0;
    for(int i=0;i<20;i++)
        arraystring[i]="";
    for(int i=0;i<searchstring.length();i++)
    {
        cout<<"\n segregating string\t";
        if(searchstring[i]==' ')
        {
            m=m+1;
            arraystring[m]="";
            cout<<"AAAAAAAAAAA\n";
        }
        else
        {
            arraystring[m]+=searchstring[i];
            cout<<"BBBBBBBBBBBB\n";
        }
        /*if((searchstring[i]>='a'&&searchstring[i]<='z')||(searchstring[i]>='A'&&searchstring[i]<='Z')||searchstring[i]=='/'||searchstring[i]=='_')
            {
                arraystring[m]+=searchstring[i] ;
                cout<<"\n adding to array\t";
            }
        else
        {
            m++;
            //n=0;
            cout<<"\n incrementing 1\t";
        }*/
    }

    //Searching for individual string to be as a part of links we crawled "State Automata Search"
    cout<<"\n"<<iqueue->front->link<<"\n-------------------\t";
    indexqueue iqu[m];
    struct indexnode *tempiq;
    for(int x=0;x<m;x++)
    {
        cout<<"\n 11111111111111\t";

        //iqu[x]=new createindexqueue();
        //=createindexnode(" ");
        tempiq=iqueue->front;                      //above mentioned code segment
        cout<<"\n"<<iqueue->front->link<<""<<iqueue->front<<"\t________________________";
    if(tempiq)// && iqueue->front)
        cout<<"\n aaaaaaaaaaaaaaaaaaaa\t";
        while(tempiq)
        {
            cout<<"\n entered the tempiq inorder to search\t";
            indexnode *temp;
            temp=(iqu[x].front);
            char *c,*c2;
            strcpy(c,(tempiq->link).c_str());
            strcpy(c2,arraystring[x].c_str());
            if(searchauto(c2,c))
                {
                    cout<<"\n checking for automata\t";
                    while(temp)
                    {
                        cout<<"\n entered while\t";
                        if(temp->next!=NULL)
                        temp=temp->next;
                        else
                            {
                                cout<<"\n creaing indexes\t";
                                indexnode *am=createindexnode(tempiq->link);
                                temp->next=am;
                            }
                    }
                }


            tempiq=tempiq->next;
        }
    }

    for(int i=0;i<m;i++)
    {
        indexqueue q=iqu[i];
        indexnode *qt=q.front;
        while(qt)
        {
            cout<<"---"<<qt->link<<"---";
            qt=qt->next;
            cout<<"\n";
        }

        cout<<"\n\n\n";
    }
        //cout<<endl<<iqueue->front->down->abc<<endl;
        //cout<<iqueue->rear->down->abc;
        cout<<endl;
        return 1;
    }

【问题讨论】:

  • 这将有助于分享其余代码
  • 需要注意的是tempiq(赋值后)肯定为null。
  • @Smeeheey 先生,添加了完整的代码。
  • 哪一行给出了段错误?
  • while(temp) 出现分段错误

标签: c++ memory-management segmentation-fault g++ dynamic-memory-allocation


【解决方案1】:

我不确定是不是导致您的分段错误的问题,但是......这是一个问题。

按照以下说明

        char *c,*c2;
        strcpy(c,(tempiq->link).c_str());
        strcpy(c2,arraystring[x].c_str());
        if(searchauto(c2,c))

您使用strcpy() 在几个未定义(cc2 未初始化)和未分配的内存区域中写入。

您确定需要将这对std::string 复制到char * 指向的区域吗?

在这种情况下,您应该分配所需的内存;像这样的

        char *c,*c2;
        c  = new char[(tempiq->link).size()+1U];
        c2 = new char[arraystring[x].size()+1U];
        strcpy(c,(tempiq->link).c_str());
        strcpy(c2,arraystring[x].c_str());
        if(searchauto(c2,c))

但请记住delete [] cc2

如果你真的需要几个分配的char *

但我想你可以简单地将这对std::stringc_str() 值传递给searchauto()

       if(searchauto((tempiq->link).c_str(), arraystring[x].c_str()))

如果你定义constsearchauto()的参数

int searchauto(const char *pat, const char *txt)

computeTransFun()的第一个

void computeTransFun(const char *pat, int M, int TF[][NO_OF_CHARS])

ps:对不起,我的英语不好。

【讨论】:

    猜你喜欢
    • 2018-06-16
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多