2015-08-28 2 views
0

Я пытаюсь найти способ случайного выбора слова из массива char 2d и поместить его в другой массив символов. Вот мой код:Назначить строку массиву char из массива 2d char C++

char wordbank[5][20] = {"house", "car", "tree", "bicycle", "shark"}; 
    int random = rand() % 5; 
    char word[20] = wordbank[random]; 

Я получаю ошибку компиляции на последнюю строку, которая говорит: Массив должен быть инициализирован с фигурной скобкой прилагаемого инициализатором. Каким будет правильный способ?

+4

Если вы работаете с * строками *, используйте 'std :: string' в C++. Кроме того, обязательно указывайте * точные * сообщения об ошибках. Мы не видим экран вашего компьютера. – crashmstr

+2

'rand()% 0' ...? – Daniel

+0

rand()% 0.. ?? Деление на ноль .! ! ! Даже если вы скомпилируете его успешно, он должен сработать.! –

ответ

1

Вы получаете ошибку компиляции, потому что вы пытаетесь присвоить символ * в массив символов.

Поскольку wordbank является двумерным массивом wordbank [index], будет char * (указатель на char). C и C++ не имеют никакого неявного преобразования из char * в массив char. Следовательно, вы получите ошибку компиляции.

Если вы хотите получить копию случайной строки в Wordbank, это можно сделать так:

char wordbank[5][20] = {"house", "car", "tree", "bicycle", "shark"}; 
srand (time(NULL)); 
int random = rand() % 5; 
char word[20]; 
strcpy(word, wordbank[random]); // strcpy (string copy) takes a copy of the 2nd string 
           // (i.e. wordbank[random]) and puts it into the 1st 
           // string (i.e. word). 

Если вы просто хотите, чтобы указать на произвольную строку в Wordbank, это ча быть сделано, как это:

char wordbank[5][20] = {"house", "car", "tree", "bicycle", "shark"}; 
srand (time(NULL)); 
int random = rand() % 5; 
char* word = wordbank[random]; // word is a pointer to a string. It is 
           // initialized to point to the string 
           // held by wordbank[random] 

С помощью первого метода вы можете изменить значение слова, не изменяя значение wordbank. При втором методе вы будете менять оба одновременно.

BTW - используйте std :: string вместо строки и вектора стиля C вместо массива. Если вы действительно хотите, чтобы массив использовал стиль C++.

Что-то вроде:

vector<string> wordbank;   // Make a vector of strings to hold your wordbank 
wordbank.push_back("house");  // Add words to wordbank one-by-one 
wordbank.push_back("car");  // ... 
wordbank.push_back("tree");  // ... 
wordbank.push_back("bicycle"); // ... 
wordbank.push_back("shark");  // ... 
        // or add all words at initialization - like: 
        //vector<string> wordbank {"house", "car", "tree", "bicycle", "shark"}; 

srand (time(NULL)); 
int random = rand() % wordbank.size(); 
string word = wordbank[random]; // Copy wordbank[random] into word 

Теперь вы можете просто добавить новые слова Wordbank не доводя о том, сколько слов она содержит и как долго отдельные слова.

+0

Спасибо, я думаю, что первое предложение будет работать, хотя я действительно не понимаю, что такое 'srand (time (NULL)); является. – Stu

+0

@Stu - 'srand' здесь не имеет особого значения. В любом случае - краткое объяснение: случайные числа на компьютере не являются случайными. Они рассчитаны предсказуемым образом. При использовании случайных чисел вы можете дать случайному генератору семя (например, условие начала), которое определяет последовательность чисел, которые вы получите от 'rand'. Это то, что делает 'srand' - дает семя. Поэтому, если вы сделали 'srand (1234);' вы получали бы одну и ту же последовательность каждый раз. Использование 'srand (time (NULL));' последовательность зависит от времени начала программы. Таким образом, последовательность будет отличаться при каждом запуске вашей программы. – 4386427

+0

@StillLearningok спасибо за разъяснение – Stu

1

Чтобы ответить на ваш вопрос:

char* word = wordbook[random]; 

В качестве примечания: у вас есть серьезные проблемы с тем, как вы генерировать случайные числа. Как вы гарантируете, что random никогда не станет больше 4?

0

char arrays может быть сконструирован либо с помощью инициатора брака, либо из строкового литерала.

Вот два способа инициализации массива:

char someSequence[5] = {'a','b','c','d','e'} 
    char someWord[] = "Hello"; 

Оба метода инициализатора ч использоваться с или без размера явно сказал.

Вы не можете инициализировать статический массив указателем char *.

Вот еще один способ получить ту же ошибку:

char* someArray =new char[40]; 
    char someStaticArray[40] = someArray; // notice the same compile error ? 
0

Эта строка синтаксически неверна. вы не можете инициализировать массив, как показано ниже.

char word[20] = wordbank[random]; 

, если вы хотите, чтобы инициализировать массив во время его определения, вы, чтобы использовать скобки заключены {} или «„(Уст строка Пример:“Hello»).

В вашей проблеме,

Вместо того, чтобы использовать 1D массив, используйте указатель на символ, чтобы получить слово из вашего Wordbank 2D массива.

Этот фрагмент может помочь вам. Но постарайтесь улучшить свой вопрос. Это даст вам лучшие ответы

int main() 
{ 
    char wordbank[5][20] = {"house", "car", "tree", "bicycle", "shark"}; 
    int random = (rand() % 5); 
    char *word = wordbank[random]; 
    cout << word; 
} 
1

Если вы можете использовать C++ 11, то вы должны по крайней мере использовать std::array, но, вероятно, std::vector. Затем вы можете использовать эту функцию

#include <random> 
#include <stdexcept> 
#include <cstddef> 
#include <iterator> 

template <typename Container> 
typename Container::value_type random_member(const Container& values) 
{ 
    static std::default_random_engine generator {}; 
    if (values.empty()) throw std::runtime_error {"cannot sample from empty container"}; 
    std::uniform_int_distribution<size_t> distribution {0, values.size() - 1}; 
    return *std::next(std::cbegin(values), distribution(generator)); 
} 

Вот как вы можете использовать его, в порядке возрастания здравомыслия:

#include <iostream> 
#include <array> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::array<const char*, 5> wordbank {"house", "car", "tree", "bicycle", "shark"}; 
    std::cout << random_member(wordbank) << std::endl; 

    std::array<std::string, 5> a {"house", "car", "tree", "bicycle", "shark"}; 
    std::cout << random_member(a) << std::endl; 

    std::vector<std::string> v {"house", "car", "tree", "bicycle", "shark"}; 
    std::cout << random_member(v) << std::endl; 

    return 0; 
} 
0
const int size = 5; 
const char * wordbank[size] = 
{"house", "car", "tree", "bicycle", "shark"}; 

const char * word = wordbank[ rand() % size ]; 

Размер номер строки. Wordbank - это массив строк, его размер - 5.word - это строка, которая является результатом случайного индекса. Индекс задается функцией rand, которая имеет диапазон 0-4, поэтому вне диапазона.

+0

Не могли бы вы добавить пояснения к своему коду, пожалуйста? Код только ответы не полезны. –

+0

Вы должны добавить эту информацию в свой ответ, пожалуйста. –

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