#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;
}这个问题是在你编译它的时候出现的。它将编译得很好,但没有显示任何内容,然后程序将停止运行。所以我的问题是,这段代码有什么问题?
发布于 2011-02-20 05:02:34
你的代码有几个问题:
cout < charStr;应该是:
cout << charStr;如果使用g++ -Wall参数(warning all)进行编译,那么很容易就会发现这个错误。
而且,您从未设置过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++标准库字符串更好--尽管在这种情况下,您的代码实际上不需要字符串。
发布于 2011-02-20 05:01:19
stringLength为0,因此不会生成随机字符。此外,您没有为charStr分配任何内存,但是您正在将0写到NULL (这是一件坏事)。另外,我认为您指的是cout << charStr,而不仅仅是< (小于比较运算符)。
实际上你很幸运,在运行程序时没有发生任何事情。手册上说,有了这样的代码,一个怪物就会变成out of one of your nosrils。
发布于 2012-08-03 08:37:06
DashRantic说:“stringLength的未设置值可能会做一些奇怪的事情,这取决于您的编译器--许多编译器会简单地将值初始化为0,但有些编译器会将其设置为一个随机值。”
C/C++规范规定,未初始化的全局变量保证被初始化为0(参见Uninitialized Structures in C)。这不适用于自动机(函数中的局部/堆栈变量),但适用于全局变量。因此,如果您使用的是符合标准的编译器,则stringLength保证为0。
因此,您的代码应该不会产生任何输出,因为charStr在for循环结束时设置为null (根据标准,这也保证不会执行,因为在第一次循环迭代之前测试了条件)。
不幸的是,由于这些相同的规则,charStr也被保证初始化为0,因此您的空字符将被写入地址0( charStr指向的地址)。这取决于您的执行环境,这可能会也可能不会导致问题。
https://stackoverflow.com/questions/5053411
复制相似问题