C ++随机字符串数组无法正常工作?

时间:2013-12-12 22:17:47

标签: c++ arrays

string quotes[2];
        quotes[0] = "This is number one";
        quotes[1] = "this is two";
        quotes[2] = "and three";

            cout << quotes[rand() % 2] << " " << endl;
            cout << endl;

大家好,

我正在努力使它在数组中输出一个随机字符串。

我对c ++很新,这对我来说是正确的。但是在运行时,我得到1然后显示0?

5 个答案:

答案 0 :(得分:4)

问题是您的阵列没有足够的空间:

string quotes[2];

表示有效索引为01。索引2已超过数组的末尾。

当您打算初始化数组的所有元素时,可以跳过其维度,如下所示:

string quotes[] = {
    "This is number one"
,   "this is two"
,   "and three"
};

此外,如果您想获得介于0和2之间的随机数,请使用%3代替%2

cout << quotes[rand() % 3] << " " << endl;
cout << endl;

答案 1 :(得分:1)

你声明字符串引号[2],字符串引号[2]将超出数组范围。它应该是字符串引号[3]或者你只是注释//引号[2] =“和三”;因为rand()%2永远不会访问引号[2]。

答案 2 :(得分:1)

声明你的数组有3个元素

string quotes[3];

并将您的索引器更改为具有击中所有3个元素的可能性

...quotes[rand() % 3]...

答案 3 :(得分:0)

  

我对c ++很新,这对我来说是正确的。

好的,让我告诉你一些事情:在C ++中我们不使用C风格的数组。期。如果你真的想要固定大小的数组,请使用std::array。如果您想要更具动感的内容:使用std::vector。如果您想要bool的固定大小数组,请使用std::bitset,如果您想要动态,请使用boost::dynamic_bitset

  

但是当跑步时,我得到1然后显示0?

你当然可以。 %(模数)运算符将返回左侧和右侧之间的除法的余数。例如:3 % 2 = 12 % 2 = 0。在您的示例中,由于2 % 2 = 0rand() % 2将始终返回01(从不2);这是完美的,因为您的数组只包含索引01的两个元素。

如果您的意思是在2 nd索引之前有一个数组,那么您打算声明一个包含3个项目的数组:

std::array<std::string, 3> quotes;

然后将“randomizer”定义为:

std::cout << quotes[rand() % 3] << " " << std::endl;

另外,请看一下this answer,它将指出您使用rand()使用模数运算符的缺陷,以及如何修复它们。

答案 4 :(得分:0)

您的数组设置为包含2个元素,但为其分配了3个元素。另外,你有rand()生成2个值(0和1)而不是所需的三个值。 (0,1和2)我不确定这对你是否有问题,但rand()没有播种,因此每次都会生成相同的数字顺序。您的代码的可能修订如下:

#include <ctime>
string quotes[3];
    quotes[0] = "This is number one";
    quotes[1] = "this is two";
    quotes[2] = "and three";
srand(time(NULL)); //Seed the rand();
        cout << quotes[rand() % 3] << " " << endl;
        cout << endl;

希望这会有所帮助。