将字符串分配给2d字符数组c++中的字符数组
Assign string to char array from 2d char array c++
我正试图找到一种方法,从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给出,因此不存在超出范围的情况。
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?