C 从a-z生成随机字母
我正在尝试创建一个程序,该程序将从a-z生成一系列随机字母。出于某种原因,虽然它不起作用,但它也会打印其他符号。我知道我如何使用puts存在一个问题,因为puts不仅有一个序列,而且有“大小”,但我这样做只是为了检查字母生成器是否实际工作,所以我现在想重点关注它。但是,欢迎对该准则提出任何建议:)C 从a-z生成随机字母,c,C,我正在尝试创建一个程序,该程序将从a-z生成一系列随机字母。出于某种原因,虽然它不起作用,但它也会打印其他符号。我知道我如何使用puts存在一个问题,因为puts不仅有一个序列,而且有“大小”,但我这样做只是为了检查字母生成器是否实际工作,所以我现在想重点关注它。但是,欢迎对该准则提出任何建议:) #包括 #包括 #包括 char*randomString(int minSize,int maxSize); 无效打印字符串(字符**strArray,整型strArraySize); int ma
#包括
#包括
#包括
char*randomString(int minSize,int maxSize);
无效打印字符串(字符**strArray,整型strArraySize);
int main()
{
int大小,i;
字符**ptr;
printf(“输入要使用的字符数:”;
scanf(“%d”,大小(&S);
ptr=malloc(尺寸*尺寸(ptr));
如果(ptr==NULL){
printf(“无法分配内存。程序现在将终止。”);
返回-1;
}
对于(i=0;i,这里是一个工作示例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char *randomString(int minSize, int maxSize);
void printStrings(char **strArray, int strArraySize);
int main()
{
time_t t;
srand((unsigned) time(&t));
int size, i;
char **ptr;
printf("Type in the number of characters you would like to be used: ");
scanf("%d", &size);
ptr = malloc(size*sizeof(*ptr));
if (ptr==NULL) {
printf("Cannot allocate memory. The program will now terminate.");
return -1;
}
for (i=0; i<size; i++)
{
ptr[i] = randomString(5, 20);
puts(ptr[i]);
}
return 0;
}
char *randomString(int minSize, int maxSize)
{
char *rndSize, *p;
int i;
rndSize = (char *)malloc(maxSize+1);
p = rndSize;
for (i = minSize + rand() % 16; i<=maxSize; i++)
*p++ = 97 + rand() % 26;
*p = '\0';
return rndSize;
}
#包括
#包括
#包括
char*randomString(int minSize,int maxSize);
无效打印字符串(字符**strArray,整型strArraySize);
int main()
{
时间;
srand((未签名)时间(&t));
int大小,i;
字符**ptr;
printf(“输入要使用的字符数:”;
scanf(“%d”,大小(&S);
ptr=malloc(尺寸*尺寸(*ptr));
如果(ptr==NULL){
printf(“无法分配内存。程序现在将终止。”);
返回-1;
}
对于(i=0;iTry
问候
Luis您需要NUL终止所有字符缓冲区。puts
(以及所有其他字符串操作)需要它。@kaylum您能告诉我根据我的代码您的意思吗?我在这方面是新手。malloc(21)
。在您的代码中有许多这样的神奇数字。这会使您难以理解和维护。请改用符号名(#define
或const
变量等)。并且您确实应该执行错误检查-例如,如果minSize
或maxSize
较大,则代码将出现缓冲区溢出。存在许多错误。1)您没有在main结尾释放字符数组。2)您的字符串没有以null结尾。您只在最后一个ptr元素上设置了“\0”…但这是一个字符*,而不是一个字符!3)每个字符串都在随机字符串()中malloced应该在rands循环后终止。4)您尝试只打印第一个字符串,但它不是以null结尾的,因此您将超出随机字符的限制。5)为什么是malloc 21?如果maxSize更大怎么办?6)scanf之前的打印要求使用字符。因此,目标是只打印一个字符串?@Giannis没有警告很好。但确实如此这并不意味着没有任何错误(有很多错误)。分配额外的空间是第一步。像我说的那样NUL terminate如何?malloc
不会为您减少内存。我看到您尝试了ptr[I]='\0';
。但这是非常错误的。i
在这一点上是size
,这意味着它溢出了缓冲区,而且无论如何,它只尝试NUL终止其中一个字符串,而不是所有字符串。@Jona我接受了它,但我的向上投票无法显示原因,因为我是新来的。我想请您澄清一下。因为ptr是指向poi的指针INTER,使用puts(ptr[i])不应该打印存储在指向的地址中的内容?在本例中,是另一个地址。puts
的声明是int puts(const char*str)
puts
需要一个指针作为参数(并将值写入指向stdout)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char *randomString(int minSize, int maxSize);
void printStrings(char **strArray, int strArraySize);
int main()
{
time_t t;
srand((unsigned) time(&t));
int size, i;
char **ptr;
printf("Type in the number of characters you would like to be used: ");
scanf("%d", &size);
ptr = malloc(size*sizeof(*ptr));
if (ptr==NULL) {
printf("Cannot allocate memory. The program will now terminate.");
return -1;
}
for (i=0; i<size; i++)
{
ptr[i] = randomString(5, 20);
puts(ptr[i]);
}
return 0;
}
char *randomString(int minSize, int maxSize)
{
char *rndSize, *p;
int i;
rndSize = (char *)malloc(maxSize+1);
p = rndSize;
for (i = minSize + rand() % 16; i<=maxSize; i++)
*p++ = 97 + rand() % 26;
*p = '\0';
return rndSize;
}
char *randomString(int minSize, int maxSize)
(...)
rndSize = (char *)malloc(21);
memset (rndSize , 0, 21*sizeof(char));
(...)