【问题标题】:Random String Generation随机字符串生成
【发布时间】:2011-06-30 12:26:44
【问题描述】:
#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;

}

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

【问题讨论】:

  • 问题不在于编译时。您似乎遇到了“运行时”错误。

标签: c++ string random char


【解决方案1】:

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

其实你很幸运,运行程序什么也没发生……手册上说,有了这种代码,一个怪物可能会来out of one of your nosrils

【讨论】:

    【解决方案2】:

    您的代码存在几个问题:

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

    【讨论】:

      【解决方案3】:

      DashRantic 说“根据您的编译器,未设置的 stringLength 值可能会做一些奇怪的事情——许多编译器会简单地将值初始化为 0,但有些会将其设置为随机值。”

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        相关资源
        最近更新 更多