我想用这个函数创建一个随机字符串。
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.comr1yY8DWc8
你的整个代码都在调用未定义的行为,因为你在传递 string
是一个未初始化的指针,它可能 "不保证 "你在 rand_string()
函数。
你需要从 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
来看看你这边可以修复的警告。