Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从a-z生成随机字母_C - Fatal编程技术网

C 从a-z生成随机字母

C 从a-z生成随机字母,c,C,我正在尝试创建一个程序,该程序将从a-z生成一系列随机字母。出于某种原因,虽然它不起作用,但它也会打印其他符号。我知道我如何使用puts存在一个问题,因为puts不仅有一个序列,而且有“大小”,但我这样做只是为了检查字母生成器是否实际工作,所以我现在想重点关注它。但是,欢迎对该准则提出任何建议:) #包括 #包括 #包括 char*randomString(int minSize,int maxSize); 无效打印字符串(字符**strArray,整型strArraySize); int ma

我正在尝试创建一个程序,该程序将从a-z生成一系列随机字母。出于某种原因,虽然它不起作用,但它也会打印其他符号。我知道我如何使用puts存在一个问题,因为puts不仅有一个序列,而且有“大小”,但我这样做只是为了检查字母生成器是否实际工作,所以我现在想重点关注它。但是,欢迎对该准则提出任何建议:)

#包括
#包括
#包括
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));
(...)