我试图找到一种方法从2d char数组中随机选择一个单词并将其放在另一个char数组中。这是我的代码:
cell
我在最后一行收到编译错误: 必须使用大括号括起初始化器来初始化数组。 这样做的正确方法是什么?
答案 0 :(得分:1)
回答你的问题:
char* word = wordbook[random];
作为旁注:您生成随机数的方式存在严重问题。你如何保证random
永远不会超过4?
答案 1 :(得分:1)
您收到编译错误,因为您尝试将char *分配给字符数组。
由于wordbank是一个2D数组,因此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中添加新单词,而无需携带它包含多少单词以及单个单词的长度。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
char数组可以由bracer初始值设定项或字符串文字构建。
以下是初始化数组的两种方法:
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 ?
答案 4 :(得分:0)
这一行在语法上是错误的。你不能像下线一样初始化一个数组。
char word[20] = wordbank[random];
如果要在定义数组时初始化数组,则必须使用括号{}或&#34; &#34;(const string Ex:&#34; Hello&#34;)。
在您的问题中,
不使用1D数组,而是使用字符指针从2D数组字库中获取单词。
此代码段可能对您有所帮助。但是试着改善你的问题。它会给你更好的答案
int main()
{
char wordbank[5][20] = {"house", "car", "tree", "bicycle", "shark"};
int random = (rand() % 5);
char *word = wordbank[random];
cout << word;
}
答案 5 :(得分: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,因此没有超出范围。