随机字符串生成

时间:2011-02-19 20:46:15

标签: c++ string random char

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

char *charStr;
int stringLength;

void genRandom() {
    static const char alphanum[] =
        "0123456789"
        "!@#$%^&*"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0; i < stringLength; ++i) {
        charStr[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
    }

    charStr[stringLength] = 0;
}

int main()
{
    while(true)
    {
        genRandom();
        cout < charStr;
    }
    return 0;

}

编译时会出现问题。它会编译得很好但没有任何显示,然后程序将停止运行。所以我的问题是,这段代码出了什么问题?

3 个答案:

答案 0 :(得分:8)

您的代码有几个问题:

cout < charStr;

应该是:

cout << charStr;

如果使用g ++ -Wall参数进行编译(全部警告),则该错误很容易显现。

另外,你永远不会设置stringLength的值!这是为什么您通常不应该使用全局变量的一个示例 - 可能很难跟踪它们。 stringLength的未设置值可能会做奇怪的事情取决于您的编译器 - 许多编译器将简单地将值初始化为0,但有些将其设置为随机值。这种未定义的行为可能会导致严重的问题,所以要非常小心,并尝试在适当的时候始终初始化变量(对于指针来说这通常是一个更大的问题,但问题仍然存在于其他变量中)。

固定程序如下:

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

static const char alphanum[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";

int stringLength = sizeof(alphanum) - 1;

char genRandom()
{
    return alphanum[rand() % stringLength];
}

int main()
{
    while(true)
    {
        cout << genRandom();
    }
    return 0;

}

仍在使用全局变量,但我认为这更适合使用它们。我不确定你要通过使用全局char *字符串来实现什么,只是令人头疼等待发生并且没有真正给你的代码带来任何好处。通常在C ++中,最好尽可能使用C ++标准库字符串 - 尽管在这种情况下,您的代码确实不需要字符串。

答案 1 :(得分:2)

stringLength为0,因此不会生成随机字符。你也没有为charStr分配任何内存,但你写的是0到NULL(一件坏事)。另外,我认为您的意思是cout << charStr,而不仅仅是<(小于比较运算符)。

实际上你很幸运,运行该程序没有任何反应......手册说,使用这种代码,怪物可能来out of one of your nosrils

答案 2 :(得分:1)

DashRantic说“stringLength的未设置值可能会做奇怪的事情取决于你的编译器 - 许多编译器只会将值初始化为0,但有些会将其设置为随机值。”

C / C ++规范说未初始化的GLOBAL变量保证初始化为0(参见Uninitialized Structures in C)。自动化(函数内部的局部/堆栈变量)不是这样,但它是全局变量。因此,如果您使用的是符合标准的编译器,则stringLength保证为0。

因此,您的代码不应该产生输出,因为在for循环结束时charStr [0]被设置为null(同样,根据标准,保证不会执行,因为条件在第一次循环迭代)。

不幸的是,由于这些相同的规则,charStr保证也被初始化为0,因此你的空字符被写入地址0(其中charStr指向)。取决于您的执行环境,可能会或可能不会导致问题。