【问题标题】:terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid在抛出 'std::logic_error' what() 的实例后调用终止:basic_string::_S_construct null 无效
【发布时间】:2017-04-11 03:32:01
【问题描述】:

我一直在尝试将 cfg 读入多链接列表,但我收到此错误,请有人帮忙。它不断给出这个错误。我不认为有任何错误。请检查此代码并告诉我导致程序崩溃的错误在哪里,并附有图片中的异常


 #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 读入多链接列表,但我收到此错误,请有人帮忙 **

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

【问题讨论】:

  • 看到调试程序按钮了吗?可以派上用场...

标签: c++ string pointers


【解决方案1】:

您的错误可以减少到非常小的情况:

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

正在发生的事情是试图用 NULL 指针生成 std::string。显然,string 没有什么可以使用的,所以它做了它唯一能做的事:尖叫求救。

解决方案:

不要分配任何东西。 std::string 会默认构造一个空字符串。

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 2019-02-08
    • 2012-07-27
    • 2023-01-17
    • 1970-01-01
    • 2022-01-11
    • 2019-10-26
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多