我正在尝试使用此功能创建随机字符串:
static char *rand_string(char *str)
{
const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
int i;
for ( i = 0; i < 10; i++)
{
int key = rand() % (int) (sizeof charset - 1);
str[i] = charset[key];
}
str[11] = '\0';
return str;
}
问题是这样的:有时当我要打印指针时,它会显示一些奇怪的字符,如下所示: 如您所见,在第一次启动时,字符串中的字符为10,在第二次和第三次启动中,字符串中的字符为11 ...
这是我的程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
static char *rand_string(char *str);
int main()
{
char *string, //str
*string_result; //str1
int dimensione= 15,
i;
for(i=0;i<dimensione;i++)
{
string_result = rand_string(string);
printf("%s\n", string_result);
}
}
static char *rand_string(char *str)
{
const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
int i;
for ( i = 0; i < 10; i++)
{
int key = rand() % (int) (sizeof charset - 1);
str[i] = charset[key];
}
str[11] = '\0';
return str;
}
您可以在此处查看和测试我的代码-> https://onlinegdb.com/r1yY8DWc8
答案 0 :(得分:0)
您的整个代码都会调用未定义的行为,因为您传递了string
,这是一个未初始化的指针,对于在rand_string()
函数中访问的11个字节,可能“不能”保证对其进行访问。
您需要从main()
分配内存,并将该缓冲区传递给随机字符串生成器函数填充,这样您就可以控制要修改的内存。
此外,生成器中的for
循环已经填充了从0
到9
的索引。要将最后一个字节设置为NULL,您需要使用索引10。
标头time.h
和unistd.h
在这里也没有用。这是通过malloc()
分配的相同程序的重写。还将函数rand_string()
修改为void而不是返回字符串。
#include <stdio.h>
#include <stdlib.h>
void rand_string(char *str);
int main()
{
int dimensione= 15;
char *string = malloc(11 * sizeof *string); // extra byte for NULL
if (!string) return 1;
int i;
for(i=0;i<dimensione;i++)
{
rand_string(string);
printf("%s\n", string);
}
free(string);
return 0;
}
void rand_string(char *str)
{
const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
int i;
for ( i = 0; i < 10; i++)
{
int key = rand() % (int) (sizeof charset - 1);
str[i] = charset[key];
}
str[10] = '\0';
}
始终使用额外的标志进行编译,以启用来自编译器的各种警告。例如与gcc
一起使用时,请始终添加-Wall -Wextra
来查看可以从侧面解决的警告。