我试图在C中创建一个包含3到10个字母之间的100个随机大小的字符串,但是我有点麻烦。这就是我到目前为止......
int main() {
int count, number;
char *randomWord[100]; // 1-d array of pointers to char
char randomLetter;
int wordLength;
// generate 100 strings or random sizes between 3 and 10 letters
for (count = 0; count < 100; count++) {
wordLength = ((rand() % 10) + 3); // get random size of word
randomWord[count] = malloc(wordLength + 1); // allocated space for word
for (number = 1; number < wordLength; number++) {
randomLetter = 'A' + (rand() % 26);
//randomWord[count] =
printf("%d\n", randomLetter);
}
printf("%d\n", &randomWord[count]);
}
}
我得到的输出看起来像这样......
72
90
82
73
87
75
66
65
6356712
88
66
71
70
67
66
67
69
89
72
74
6356716
71
73
88
87
6356720
任何帮助或指示都将不胜感激。
答案 0 :(得分:2)
首先,正如您所知,您不会写入randomWord[count]
,因此您无法在以后打印出结果。
其次,您需要使用\0
终止每个字符串,并且您应该使用printf("%s\n", randomWord[count]);
,即不使用&
和%s
。不终止字符串并在printf("%s"...
中使用它很可能产生未定义的行为;打印字符串时,请使用%s
,而不是%d
。使用%s
时,printf
需要指向字符串第一个字符的指针。正如您定义的char *randomWord[100]
,randomWord[count]
代表指向字符的指针,而&randomWord[count]
代表指针的地址,而不代表字符串的第一个字符。< / p>
wordLength = ((rand() % 10) + 3); // get random size of word
randomWord[count] = malloc(wordLength + 1); // allocated space for word
for(number = 0; number < wordLength; number++)
{
randomLetter = 'A' + (rand() % 26);
randomWord[count][number] = randomLetter;
// printf("%c", randomLetter);
}
randomWord[count][wordLength] = '\0';
printf("%s\n", randomWord[count]);
顺便说一句:请注意(rand() % 10) + 3)
提供3
和12
之间的随机长度,而不是3
和10
之间的长度。
答案 1 :(得分:0)
您实际上使用了错误的格式说明符:
%d
用于输出带符号的十进制整数
%c
用于输出字符。
您的内心printf
应该成为:printf("%c\n", randomLetter)
答案 2 :(得分:0)
我不会用其他答案犁过同样的地方。你现在明白了:
printf("%d\n", &randomWord[count]);
正在尝试打印指针的地址 randomWord[count]
而不是您尝试打印ASCII值的所有字符。请记住,&
是一元运算符的地址,而*
是解除引用运算符。 (通过尝试使用%d
格式说明符打印指针地址来调用未定义行为。使用%p
打印地址)
不是从模数操作中创建每个字符,而是简单地从文字A-Za-z0-9
(或您希望包含的任何字符集)中选择随机索引可能更容易。这真的是#6;六对一&#34; a&#34;半打到另一个&#34;,但概念上可以更容易地跟踪你在做什么。
在查看替代方案之前,请在代码中使用幻数来解决问题。 (不要这样做)。如果您需要在代码中使用常量,那么#define
或使用全局enum
来执行相同操作。例如,如果您需要生成最小长度的常量(例如MINL
)和最大长度MAXL
或最大字符串数MAXS
(以及从NCHR
)中选择的字符数,您可以使用以下命令定义常量:
enum { MINL = 3, MAXL = 10, NCHR = 62, MAXS = 100 };
通过这种方式,您可以在代码顶部找到一个方便的位置来根据需要调整值 - 而无需选择变量和循环声明来执行此操作。
现在替代方案。您可以简单地声明一个字符串文字alpha
,其中包含您要创建的100
随机字符串。然后,所需要的只是获得每个存储的随机长度,分配length + 1
字节的存储空间,并在length
和0
之间创建NCHR - 1
个随机数,将字符分配给你的字符串中的索引和最后的nul终止。
(注意:,通过使用calloc
,您已经在每个字符串中填充了零的最后一个字节,有效地提供了nul-termination,但是肯定是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
查看所有答案。有好的观点。如果您有任何其他问题,请告诉我们。
答案 3 :(得分:0)
存在多个问题:
0
开始循环会解决这个问题。以下是修复代码的方法:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int count, number;
char *randomWord[100]; // 1-d array of pointers to char
// generate 100 strings or random sizes between 3 and 10 letters
for (count = 0; count < 100; count++) {
int wordLength = 3 + rand() % 8; // get random word size in 3..10
randomWord[count] = malloc(wordLength + 1); // allocated space for word
for (number = 0; number < wordLength; number++) {
randomWord[count][number] = 'A' + rand() % 26;
}
randomWord[count][number] = '\0';
printf("%s\n", randomWord[count]);
}
return 0;
}