2015-07-17 6 views
0

Я пытаюсь заполнить строку символами из строки 'reset \ 0', но рандомизирован. По какой-то причине он только дает мне один символ Спинка:Строка не заполняется случайными символами (C)?

#define STR_LEN 6 
char *inputString() 
{ 
    char *string[STR_LEN + 1] = {0}; 
    const char *digits = "reset\0"; 
    int i; 

    for (i = 0; i < STR_LEN; i++) 
    { 
     string[i] = digits[ rand() % 5 + 0 ]; 
    } 

    printf("STRING: %s\n", string); 
} 

печатает только один символ, как «т» или «е» на консоль. Что я делаю не так?

+8

переменная 'string' является массивом * указателей * на символы, а не на массив символов, как вы его рассматриваете. Этот код должен был дать вам много предупреждений, а если нет, вам нужно включить дополнительные предупреждения. –

+3

Кроме того, если у вас есть строковый литерал, например, например. '" reset "' он автоматически включает в себя ограничитель строки, имея '" reset \ 0 "' у вас есть * два * терминатора и отходы байта. –

+0

Вы должны использовать макрос 'NULL', а не целое число' 0'. Последнее также устарело и в C++. – Olaf

ответ

0

Если вы имеете в виду сделать произвольную перестановку символов, а не только использовать исходную строку в виде алфавита, рассмотрите Fisher–Yates shuffle. Реализация может быть такой:

char s[] = "reset"; 
for (size_t i = strlen(s) - 1; i > 0; i--) 
{ 
    size_t j = rand() % (i + 1); 
    char t = s[i]; 
    s[i] = s[j]; 
    s[j] = t; 
} 
printf("%s\n", s); 

Идея заключается в том, чтобы идти справа налево, и на каждом шагу, чтобы поменять элемент с индексом i с элементом в произвольном порядке индекса j между 0 и i включительно.

+1

Осторожно. Очень легко случайно реализовать смещенную перетасовку (например, ту, которая не может генерировать определенные перестановки). См. Статью [Wikipedia «Fisher-Yates Shuffle»] (https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) для правильной реализации. – duskwuff

+0

@ duskwuff Хм ... Он близок к [Современный алгоритм] (https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm) из статьи. Это предвзято? (Помимо того факта, что '% (i + 1)' создает небольшое смещение в случайных числах?) – AlexD

+0

Эта конкретная реализация выглядит сбалансированной. Я хочу сказать, что незначительные, случайные изменения могут приводить к предубеждениям, поэтому важно проверить результаты. – duskwuff

0

Исправленный код

#define STR_LEN 5 

    char *inputString() 
    { 
     char string[STR_LEN + 1] = {0}; 
     const char *digits = "reset"; 
     int i; 

     for (i = 0; i < STR_LEN; i++) 
     { 
      string[i] = digits[ rand() % 5 + 0 ]; 
     } 

     printf("STRING: %s\n", string); 
    } 

Но обратите внимание, что это не делает то, что вы хотите, это напечатать 5 случайных символов из «перезагрузки» так «ssere» может быть выведен

+0

Функция должна вернуть что-то. И это не должно быть указателем на локальную переменную :). – AlexD

Смежные вопросы