将字符串从2d char数组c ++分配给char数组

时间:2015-08-28 12:48:51

标签: c++ arrays

我试图找到一种方法从2d char数组中随机选择一个单词并将其放在另一个char数组中。这是我的代码:

cell

我在最后一行收到编译错误: 必须使用大括号括起初始化器来初始化数组。 这样做的正确方法是什么?

6 个答案:

答案 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,因此没有超出范围。