0

課題用に作成したプログラムの文字列を格納するカスタム リンク リスト クラスを作成しています。int で機能するリンク リスト配布資料が提供され、文字列ストレージ用にツールを再設定するように指示されましたが、実行しようとするとエラーが発生します。

「'std::logic_error' what(): basic_string::_S_construct null のインスタンスをスローした後に呼び出された終了」というエラーが表示されます (これは、検索したところ、文字列が設定されていることが原因であることがわかりました) null、ただし、エラーを修正する方法がわかりません。8行目であると推測していますが、いじくり回して成功しませんでした。)周りを検索して、同様の質問を調べましたが、見つかりませんでした役に立ったもの。

    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <iomanip>
    using namespace std;

   struct node {
   node(string current) { data=current; next=NULL; }
   string data;
   node *next;
    };

    class list {
    public:
      list(int N=0, string current);
      ~list();
      bool empty() const { return N == 0; }
      void clear();

      void insert(int, const string &);

      void push_front(const string &current);

      friend ostream & operator<<(ostream &out, const list &current);

    private:
      int N;
      node *head;
      node *findnode(int);
      };

    list::list(int M, string current) {
      N = M;
     head = new node;
     for (int i=0; i<N; i++)
       insert(0, current);
    }

   list::~list() {
      clear();
     delete head;
    }


    void list::clear() {
      while (!empty()) remove(0);
    }

    void list::insert(int i, const string &din) {
      node *p = new node(din);
      node *pp = findnode(i-1);
      p->next = pp->next;
      pp->next = p;
      N++;
    }

    inline
    node *list::findnode(int i) {
      if (i == -1)
        return head;
      node *p = head->next; 
      while (i--)
        p = p->next;
      return p;
    }


    void list::push_front(const string &current) {
      head = new node;
      head->next;
    }

    ostream& operator<<(ostream& out, const list& current)
    {
     out << current;
     return out;
   }


    const string rank[] = { "Ace", "2", "3", "4", "5", "6", "7",
                            "8", "9", "10", "Jack", "Queen", "King" }; 
    const string suit[] = { "Clubs", "Diamonds", "Hearts", "Spades" };

    string random_card(bool verbose=false) {
        string card;

        card = rank[ rand()%13 ];
        card += " of ";
        card += suit[ rand()%4 ];

        if (verbose)
          cout << card << "\n";

        return card;
    }

    int main(int argc, char *argv[])
    {
        bool verbose = false;
        int seedvalue = 0;
        string stop_card = "Queen of Hearts";

        for (int i=1; i<argc; i++) {
          string option = argv[i];
          if (option.compare(0,6,"-seed=") == 0) {
            seedvalue = atoi(&argv[i][6]);
          } else if (option.compare(0,6,"-stop=") == 0) {
            stop_card = &argv[i][6];
          } else if (option.compare("-verbose") == 0) {
            verbose = true;
          } else 
            cout << "option " << argv[i] << " ignored\n";
        }

        srand(seedvalue);


        list deck[4];


        while (1) {
          string card = random_card(verbose);
          char first[10];
          char second[10];
          sscanf(card.c_str(), "%s of %s", first,second);

        // reverse engineer card suit and rank

          int index2;

          //suit index
          for(int i=0; i<4; i++){
            if(suit[i]==second){       
              index2=i;
            break;
          }
          }

          deck[index2].push_front(first);

        if (card.compare(stop_card)==0){
          break;
        }

        }


     // print formatted table contents to stdout 
    cout << "Clubs : "; 
       cout << setw(3) <<  deck[0];
     cout << endl;

     cout << "Diamonds : ";
       cout << setw(3) <<  deck[1];
     cout << endl;

     cout << "Hearts : ";
       cout << setw(3) << deck[2];
     cout << endl;

     cout << "Spades :  ";
     cout << setw(3) << deck[3];
     cout << endl;

    }
4

1 に答える 1