随机字符串生成

Cis*_*ran 5 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;

}
Run Code Online (Sandbox Code Playgroud)

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

Das*_*tic 8

您的代码有几个问题:

cout < charStr;
Run Code Online (Sandbox Code Playgroud)

应该:

cout << charStr;
Run Code Online (Sandbox Code Playgroud)

如果使用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;

}
Run Code Online (Sandbox Code Playgroud)

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