随机字符串生成

5
#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;

}

问题出现在编译时。虽然编译没有错误,但是程序没有显示任何内容,然后就停止运行了。所以我的问题是,这段代码有什么问题?

2
问题不在于编译时。看起来你遇到了一个“运行时”错误。 - whitey04
3个回答

8

你的代码存在几个问题:

cout < charStr;

should be:

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++标准库字符串时使用它——尽管在这种情况下,您的代码确实不需要字符串。


2
"stringLength" 的值为 0,因此不会生成任何随机字符。另外,您没有为 "charStr" 分配任何内存,但是您正在向 NULL 写入 0(这是一件坏事)。此外,我认为您的意思是 cout << charStr 而不仅仅是 <(小于比较运算符)。
实际上,幸运的是,运行程序时没有发生任何事情……手册说,使用这种代码可能会导致一个怪物从你的鼻孔 中出现

1
DashRantic说:“stringLength的未设置值可能会因编译器而异--许多编译器会将该值初始化为0,但有些则会将其设置为随机值。”
C/C++规范说明未初始化的全局变量保证被初始化为0(请参阅 在C中未初始化结构)。这对于自动变量(函数内的本地/堆栈变量)并不适用,但对于全局变量则是如此。因此,如果您使用符合标准的编译器,则stringLength保证为0。
因此,您的代码不应该产生任何输出,因为charStr[0]在for循环结束时被设置为空(根据标准,这不会被执行,因为条件在第一次循环迭代之前进行测试)。
不幸的是,由于相同的规则,charStr也保证被初始化为0,因此您的空字符被写入地址0(即charStr指向的地址)。这可能会导致问题,具体取决于您的执行环境。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接