Генерация случайных строк - PullRequest
5 голосов
/ 19 февраля 2011
#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 ]

8 голосов
/ 20 февраля 2011

Несколько проблем с вашим кодом:

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 ++, когда это возможно, хотя в этом случае вашему коду действительно не нужны строки.

2 голосов
/ 20 февраля 2011

stringLength равно 0, поэтому случайные символы не будут генерироваться. Также вы не выделяли памяти для charStr, но вы пишете 0 в NULL (плохо). Также я думаю, что вы имеете в виду cout << charStr, а не просто < (оператор сравнения меньше).

На самом деле вам повезло, что с запуском программы ничего не произошло ... в руководствах говорится, что с этим видом кода монстр может выйти из одного из ваших носов .

1 голос
/ 03 августа 2012

DashRantic сказал: «Неустановленное значение stringLength может делать странные вещи в зависимости от вашего компилятора - многие компиляторы просто инициализируют значение 0, но некоторые устанавливают его на случайное значение».

В спецификации C / C ++ говорится, что неинициализированные переменные GLOBAL гарантированно будут инициализированы равными 0 (см. Неинициализированные структуры в C ). Это не верно для автоматики (локальные / стековые переменные внутри функции), но это глобально. Таким образом, если вы используете совместимый со стандартами компилятор, stringLength гарантированно будет равно 0.

Следовательно, ваш код не должен выдавать никаких выходных данных, поскольку charStr [0] имеет значение null в конце цикла for (который, опять же, в соответствии со стандартом, гарантированно не будет выполнен, поскольку условие проверяется перед тем, как итерация первого цикла).

К сожалению, из-за тех же правил, charStr также гарантированно инициализируется равным 0, поэтому ваш нулевой символ записывается по адресу 0 (где charStr указывает). В зависимости от среды выполнения это может вызвать или не вызвать проблему.

...