代码在运行时崩溃,但在调试时不崩溃

时间:2018-08-30 13:41:48

标签: c++ debugging crash

我应该编写一种拼字游戏,但是我有一个大问题。我应该为每个包含字母的玩家提取一张卡片,以便决定谁开始游戏。然后,我必须将卡再次放入袋中。但是,当我运行程序时,它会崩溃,但是当我使用调试程序时,它会起作用。有人可以帮我吗?

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

char letterarand(char *firstelementarray, int numelement, vector<int> &pos)
{
  srand(time(NULL));
  int n = rand() % 100;  // 0 - 99
  pos.push_back(n);
  if (firstelementarray[n] == '0') {
    pos.pop_back();
    letterarand(firstelementarray, numelement, pos);
  }
  return firstelementarray[n];
}

void order(vector<char> &letters, vector<string> &name, int num, vector<int> &positions)
{
  for (int i = 0; i < num; ++i) {
    cout << letters[i] << endl;
  }
  for (int i = 0; i < num - 1; ++i) {
    for (int j = i; j < num; ++j) {
      if (letters[i] > letters[j]) {
        char temp = letters[i];
        letters[i] = letters[j];
        letters[j] = temp;
        string swap = name[i];  
        name[i] = name[j];
        name[j] = swap;
        int temp2 = positions[i];  
        positions[i] = positions[j];
        positions[j] = temp2;
      }
    }
  }
}

void insert(char *firstelementarray, int numplayers,
                 vector<int> positions, vector<char> extract)
{
  for (int i = 0; i < numplayers; ++i) {
    cout << extract[i] << " " << positions[i] << endl;
  }
  int j = 0;
  for (int i = 0; i < numplayers; ++i) {  //letters extracted are trasformed in '0'
    firstelementarray[positions[i]] = extract[j];
    ++j;
  }
}

int main()
{
  cout << "                  UPWORDS:               "
       << endl;
  cout << endl;
  char c = '0';
  vector<string> players;
  string playersname;
  cout << "Number of player (2-4):" << endl;
  cin >> c;
  while ((!(c >= '2' && c <= '4'))) {
    cin >> c;
  }
  int playersnum = c - '0';
  vector<char> extract;
  char bag[100] = {
      'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D',
      'D', 'D', 'D', 'D', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'F', 'F', 'F',
      'G', 'G', 'G', 'H', 'H', 'H', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'J', 'K',
      'K', 'L', 'L', 'L', 'L', 'L', 'M', 'M', 'M', 'M', 'M', 'N', 'N', 'N', 'N',
      'N', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'P', 'P', 'P', 'Q', 'R', 'R', 'R',
      'R', 'R', 'S', 'S', 'S', 'S', 'S', 'S', 'T', 'T', 'T', 'T', 'T', 'U', 'U',
      'U', 'U', 'U', 'V', 'W', 'W', 'X', 'Y', 'Y', 'Z'};
  vector<int> positions;
  cout << "name players: " << endl;
  for (int i = 0; i < playersnum; ++i) {
    cout << "player " << i + 1 << " :";
    cin >> playersname;
    players.push_back(playersname);
    extract.push_back(letterarand(bag, 100, positions));
    bag[positions[i]] = '0';
  }
  order(extract, players, playersnum, positions);
  insert(bag, playersnum, positions, extract);
}

1 个答案:

答案 0 :(得分:1)

字母和递归代码很难理解。我可以建议:

char letterarand(char *firstelementarray, int numelement, vector<int> &pos)
{
  srand(time(NULL));        // should only be done once!  Move to main

  // chose random letter, not previously chosen
  int n
  do {
       n = rand() % 100;  // 0 - 99
  } while( firstelementarray[n] == '0';
  char letter = firstelementarray[n];

  // mark letter as chosen
  firstelementarray[n] = '0';

  pos.push_back(n);
  return letter;
}