В коде OP есть несколько ошибок и недостатков.
- массив строк:
const char *words = { "one", "two", "three", "four", "five", "six" };
Не уверен, как компилятор это читает (если не жалуется). Массив строк C должен быть:
const char *words[] = { "one", "two", "three", "four", "five", "six" };
- магическое число
for (int i=0; i<6; i++)
6
- это магическое число , которое считается плохим стилем. Лучше дать ему имя. Еще лучше: значение может быть определено компилятором, который улучшает удобство сопровождения кода:
int n = sizeof words / sizeof *words;
for (int i = 0; i < n; ++i) {
- использование
rand()
int r = (rand() % (6 - i)) + i;
rand()
- генератор псевдослучайных данных с некоторыми ограничениями. Не следует использовать с % n
. Для некоторых n
с (например, 2) это может привести к довольно неслучайной последовательности. Справочный документ. из rand()
дает лучший пример, который я превратил в функцию:
int randomRange(int min, int max)
{
for (int range = max - min;;) {
int x = min + rand() / ((RAND_MAX + 1u) / range);
if (x < max) return x;
}
}
который называется
int r = randomRange(i, n);
- идиоматический своп
int temp = words[i];
Если тип элементов массива для обмена - const char*
, temp
также должно быть:
const char *temp = words[i];
words[i] = words[j];
words[j] = temp;
Полный пример кода:
#include <stdio.h>
#include <stdlib.h>
int randomRange(int min, int max)
{
for (int range = max - min;;) {
int x = min + rand() / ((RAND_MAX + 1u) / range);
if (x < max) return x;
}
}
int main(void)
{
/* an array of strings */
const char *words[] = { "one", "two", "three", "four", "five", "six" };
/* let compiler determine size */
int n = sizeof words / sizeof *words;
/* shuffle */
for (int i = 0; i < n; ++i) {
int j = randomRange(i, n);
/* idiomatic swap */
const char *temp = words[i];
words[i] = words[j];
words[j] = temp;
}
/* print result */
const char *sep = "";
for (int i = 0; i < n; ++i) {
printf("%s%s", sep, words[i]);
sep = ", ";
}
/* done */
return 0;
}
Выход:
six, three, one, two, four, five
Демонстрация в реальном времени на coliru