2016-11-27 3 views
-1

Я пытался читать cfg в multilinklist, но im получаю эту ошибку, пожалуйста, помогите кому-нибудь. Он продолжает давать эту ошибку. Я не думаю, что есть какая-то ошибка. Пожалуйста, проверьте этот код и скажите мне, где ошибка, которая приводит к аварийному завершению программы, за исключением присоединенной в картинезавершение вызова после вызова экземпляра 'std :: logic_error' what(): basic_string :: _ S_construct null недействителен


#include <iostream> 
    #include <fstream> 
    #include <cstring> 

    using namespace std; 

    struct prod_list{ 

     string production; 
    struct prod_list *next; 

    }*head_p=NULL; 

    //Node for linked list to store Non terminals 

    struct rule_list{ 

     char non_terminal; 
     struct prod_list *first; 
     struct rule_list *next; 

    }*head_r=NULL; 

    // Global variable 
     struct prod_list *temp_p,*prev_p=NULL,*first_p=NULL,*temp1_p=NULL,*temp2_p,*newTemp; 
     struct rule_list *temp_r,*prev_r=NULL,*first_r=NULL ,*temp1_r=NULL; 



    prod_list *adding_productions_of_the_rule(string line); 
    prod_list *add_node(prod_list *root, string production); 


    int main() 
    { 

    string line; 

    ifstream file ("cfg.txt"); 
    if (file.is_open()) 
    { 
     while (getline (file,line)) 
     { 
      head_p = NULL; 

      // Creating rule_list node 
      temp_r = new rule_list; 
      temp_r->non_terminal = line[0]; 
      head_p = adding_productions_of_the_rule(line); 
      temp_r->first = head_p; 
      temp_r->next = NULL; 

      if(head_r == NULL) 
      { 
       head_r = temp_r; 
       prev_r = temp_r; 
      } 
      else 
      { 
       prev_r->next = temp_r; 
       prev_r = temp_r; 
      } 


     } 
     file.close(); 
    } 
    else 
    { 
     cout << "Unable to open file"; 
    } 

    return 0; 
    } 







    prod_list *adding_productions_of_the_rule(string line) 
    { 

      string prod = NULL; 

      // Splitting line after arrow in cfg rule line. 
      line = line.substr(3,line.length()); 
      // cout << "The cfg is "+line << endl; 

      // declaring character array of line's length 
      char ch[line.length()]={0}; 
      // memset(ch,'0',line.length()); 
      // cout << sizeof(ch) << endl; 


      // storing line in character array and printing character array 
      for(int i=0; i<line.length(); i++){ 
       ch[i] = line[i]; 
       // Displaying the characters stored in character array from string line. 
       // cout << ch[i]; 
      } 
      // cout << endl; 

      char *point; 
      point = strtok(ch, "|"); 
      while(point != NULL){ 

       // cout << point << endl; 

       // Assigning each production from the cfg rule to an array of strings 
       // production[i] = point; 
       // cout << production[i] << endl; 


       // Creating prod_list node 
       prod = point; 
       head_p = add_node(head_p, prod); 


       point = strtok(NULL, "|"); 
       // i++; 

      } 


      return head_p; 
    } 






    prod_list *add_node(prod_list *root, string production){ 


    prod_list *next_ptr = NULL; 
    prod_list *prev_ptr = NULL; 

    if(root == NULL){ 
     //list is empty 
     if((root = new prod_list) != NULL){ 
      next_ptr = root; 
      // cin >> next_ptr->title; 
      next_ptr->production = production; 
      next_ptr->next = NULL; 

     }else{ 
      cout << "Error: Unable to allocate memory. " << endl; 
      return NULL; 
     } 
     return next_ptr; 
    }else{ 
     //list has members. 
     next_ptr = root; 
     while(next_ptr->next != NULL){ 
      next_ptr = next_ptr->next; 
     } 
     prev_ptr = next_ptr; 

     if((next_ptr = new prod_list)!= NULL){ 
      prev_ptr->next = next_ptr; 
      next_ptr->production = production; 
      next_ptr->next = NULL; 
     }else{ 
      cout << "Error: Unable to allocate memory " << endl; 
     } 

    } 
    return root; 
    } 

** Я пытался читать CFG в multilinklist, но им получаю эту ошибку, пожалуйста, кто-то помощь **

https://i.stack.imgur.com/AgNXB.png

+1

Посмотрите, что отладка кнопки программы? Может пригодиться ... – user4581301

ответ

0

Ваша ошибка сводится к очень минимальном случае:

#include <string> 
int main() { 
    std::string prod = NULL; 
} 

Что происходит, это попытка сделать std::string из указателя NULL. Очевидно, нет ничего для работы string, поэтому он сделал единственное, что мог: кричать о помощи.

Не назначайте ничего. std::string будет по умолчанию строить пустую строку.

+0

Спасибо большое! Это сработало –

Смежные вопросы