如何在C中随机排列字符串中的字符
How to shuffle characters within a string in C
我正在创建一个程序,其中一部分需要一个单词,并将字母打乱。
我知道 C 中正式没有字符串数据类型,所以从技术上讲,单词中的字符已经在数组中了?他们只需要分类。 (无论如何,这是我的理解)。
我也知道C对真正的随机数不是很好,我通常使用时间作为种子,不确定这是否会影响打乱字母。
例如:
单词你好
分割成字符 H/E/L/L/O
洗牌 E/L/O/H/L
新单词 Elohl
technically the characters in the word are already in array?
您可以将它们视为以 null 结尾的字符数组。将您最喜欢的随机播放算法应用于字符串中介于 0(含)和 strlen(str)
之间的部分,以生成随机播放的字符串。
这里唯一的问题是并非所有字符串都可以就地洗牌。具体来说,表示字符串文字的字符串是不可写的。尝试更改它们会导致未定义的行为。
例如,如果您这样做
char *word = "hello";
shuffle(word);
并尝试在 shuffle
中修改 word
的字符,你会得到未定义的行为。您需要先将内容复制到可写数组中,然后才能随机播放内容 - 例如,像这样:
char word[] = "hello";
shuffle(word);
int compare(const void *a, const void *b){
return *(const char *)a - *(const char *)b;
}
char arr[] = "dbaurjvgeofx";
printf("Unsorted: %s\n", arr);
qsort(arr, strlen(arr), 1, compare);
printf("Sorted: %s\n", arr);
我正在创建一个程序,其中一部分需要一个单词,并将字母打乱。 我知道 C 中正式没有字符串数据类型,所以从技术上讲,单词中的字符已经在数组中了?他们只需要分类。 (无论如何,这是我的理解)。 我也知道C对真正的随机数不是很好,我通常使用时间作为种子,不确定这是否会影响打乱字母。
例如:
单词你好
分割成字符 H/E/L/L/O
洗牌 E/L/O/H/L
新单词 Elohl
technically the characters in the word are already in array?
您可以将它们视为以 null 结尾的字符数组。将您最喜欢的随机播放算法应用于字符串中介于 0(含)和 strlen(str)
之间的部分,以生成随机播放的字符串。
这里唯一的问题是并非所有字符串都可以就地洗牌。具体来说,表示字符串文字的字符串是不可写的。尝试更改它们会导致未定义的行为。
例如,如果您这样做
char *word = "hello";
shuffle(word);
并尝试在 shuffle
中修改 word
的字符,你会得到未定义的行为。您需要先将内容复制到可写数组中,然后才能随机播放内容 - 例如,像这样:
char word[] = "hello";
shuffle(word);
int compare(const void *a, const void *b){
return *(const char *)a - *(const char *)b;
}
char arr[] = "dbaurjvgeofx";
printf("Unsorted: %s\n", arr);
qsort(arr, strlen(arr), 1, compare);
printf("Sorted: %s\n", arr);