我不会耕种其他答案耕种的相同土地。你现在明白了:
printf("%d\n", &randomWord[count]);
正在尝试打印 指针的地址 randomWord[count],而不是您尝试打印 ASCII 值的字符。请记住& 是地址 一元运算符,而* 是取消引用 运算符。 (通过尝试使用%d 格式说明符打印指针地址来调用未定义行为。使用%p 打印地址)
与其从 模 运算中发明每个字符,不如简单地从文字 A-Za-z0-9(或您希望包含的任何字符集)中选择一个随机索引可能更容易。这实际上是“六比一”和“六比一”,但从概念上讲,跟踪您正在做的事情可能更容易。
在寻找替代方案之前,让我们在您的代码中使用幻数。 (不要这样做)。如果您需要在代码中使用常量,那么 #define 它们或使用全局 enum 来做同样的事情。例如,如果您需要生成字符串的最小长度常量(比如MINL)和最大长度MAXL 或最大字符串数MAXS(以及要生成的字符数)从NCHR) 中选择,您可以简单地定义常量:
enum { MINL = 3, MAXL = 10, NCHR = 62, MAXS = 100 };
这样,您可以在代码顶部有一个方便的位置来根据需要调整值 - 无需通过变量和循环声明来进行调整。
现在是替代方案。您可以简单地声明一个字符串文字alpha,其中包含您希望从中创建100 随机字符串的字符。然后所需要做的就是为每个获取随机长度,分配length + 1 字节的存储空间,并在0 和NCHR - 1 之间创建length 随机数,将字符分配给字符串中的索引并进行空终止最后。
(注意:通过使用calloc,您已经用零填充每个字符串中的最后一个字节,有效地提供了nul终止,但是肯定地nul终止每个字符串是一个好习惯字符串)
总而言之,您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
enum { MINL = 3, MAXL = 10, NCHR = 62, MAXS = 100 };
int main (void) {
char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" /* NCHR long literal */
"abcdefghijklmnopqrstuvwxyz" /* of chars to shuffle */
"0123456789",
*a[MAXS] = { NULL }; /* array of pointers to char */
int modlen = MAXL - MINL + 1; /* mod length for 3 - 10 char */
srand (time (NULL)); /* seed random number generator */
for (int i = 0; i < MAXS; i++) { /* loop to create MAXS strings */
int len = rand() % modlen + MINL; /* get length 3 - 10 */
if (!(a[i] = calloc (len + 1, 1))) { /* allocate memory */
fprintf (stderr, "error: memory exhausted 'a[%d]'.\n", i);
return 1;
}
for (int j = 0; j < len; j++) /* loop over len chars */
a[i][j] = alpha[rand() % NCHR]; /* assing char from alpha */
a[i][len] = 0; /* affirmatively nul-terminate */
}
for (int i = 0; i < MAXS; i++) { /* output results */
printf ("a[%2d] : %s\n", i, a[i]);
free (a[i]); /* don't forget to free your memory */
}
return 0;
}
使用/输出示例
$ ./bin/str_randshuffle
a[ 0] : KhwC0FhKv
a[ 1] : j4U4zwfHf
a[ 2] : vSd
a[ 3] : 4jWlzWJ725
a[ 4] : q9h
a[ 5] : sxYmHSZ1w
a[ 6] : WSPot
a[ 7] : hTD
a[ 8] : GXQ
a[ 9] : NJD3GksyYE
a[10] : dUvVGPrWe
....
a[92] : vHl5
a[93] : 5LZjkFYl
a[94] : Q4Y
a[95] : 67sWds
a[96] : YlQWDuFKV8
a[97] : PHJwrOLQ6b
a[98] : U0EPiarOi
a[99] : zyZ2gcB2aw
查看所有答案。有很好的观点。如果您还有其他问题,请告诉我们。