将字符串分配给2d字符数组c++中的字符数组

Assign string to char array from 2d char array c++

本文关键字:字符 数组 c++ 2d 字符串 分配      更新时间:2023-10-16

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

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

我在最后一行收到一个编译器错误,上面写着:数组必须使用大括号(一个封闭的初始值设定项(进行初始化。做这件事的正确方法是什么?

由于试图将char*分配给一个字符数组,因此会出现编译错误。

由于单词库是2D数组,因此单词库[index]将是char*(指向char的指针(。C和C++没有从char*到char数组的隐式转换。因此,您将得到一个编译错误。

如果你想在单词库中复制一个随机字符串,可以这样做:

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).

如果你只想指向单词库中的一个随机字符串,可以这样做:

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]

使用第一种方法,您可以在不更改单词库值的情况下更改单词的值。使用第二种方法,您将同时更改这两种方法。

BTW-使用std::string代替C样式字符串,使用vector代替数组。如果您真的想要一个数组,请使用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

现在,你可以在单词库中添加新单词,而不必记录它包含的单词数量和单个单词的长度。

回答您的问题:

char* word = wordbook[random];

顺便说一句:你在生成随机数的方式上有一个严重的问题。如何保证random永远不会大于4?

如果您可以使用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;
}

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 ?

这一行语法错误。不能像下面的行那样初始化数组。

char word[20] = wordbank[random];

如果要在定义数组时对其进行初始化,则必须使用大括号括起的{}或"(const字符串Ex:"Hello"(。

在你的问题中,

不要使用1D数组,而是使用字符指针从2D数组单词库中获取单词。

这个片段可能会对你有所帮助。但是试着改进你的问题。它会给你更好的答案

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

Size是字符串的数目。单词库是一个字符串数组,大小为5。单词是一个随机索引的结果。该索引由范围为0-4的函数rand给出,因此不存在超出范围的情况。