我需要一个函数的工作代码,它将返回一个随机长度的随机字符串。
以下代码将更好地描述我想要做的事情。
char *getRandomString()
{
char word[random-length];
// ...instructions that will fill word with random characters.
return word;
}
void main()
{
char *string = getRandomString();
printf("Random string is: %s\n", string);
}
为此,我严格禁止使用除 stdio.h 之外的任何其他内容。 编辑:这个项目将适合为PIC微控制器编译,因此我不能使用malloc()或类似的东西。 我在这里使用 stdio.h 的原因是我能够使用 GCC 检查输出。
目前,此代码会出现此错误.- “warning:function返回局部变量的地址[默认启用]”
然后,我认为这可行.-
char *getRandomString(char *string)
{
char word[random-length];
// ...instructions that will fill word with random characters.
string = word;
return string;
}
void main()
{
char *string = getRandomString(string);
printf("Random string is: %s\n", string);
}
但它只打印了一堆无意义的字符。
答案 0 :(得分:4)
有三种常见的方法可以做到这一点。
让调用者传入指向要存储数据的数组(的第一个元素)的指针以及一个长度参数。如果要返回的字符串大于传入的长度,则表示错误;你需要决定如何处理它。 (你可以截断结果,或者你可以返回一个空指针。无论哪种方式,调用者都必须能够处理它。)
返回指向新分配对象的指针,使调用者有责任在完成后调用free
。如果malloc()
失败,可能会返回一个空指针(这总是有可能的,你应该总是检查它)。由于malloc
和free
在<stdlib.h>
中声明,因此不符合您的(人为)要求。
返回指向 static 数组(的第一个元素)的指针。这避免了将指针返回到本地分配的对象的错误,但它有其自身的缺点。这意味着以后的调用会破坏原始结果,并且它会产生固定的最大大小。
如果这些是理想的解决方案,则无。
答案 1 :(得分:2)
它指向无意义的字符,因为您正在返回本地地址。 char word[random-length];
在char *getRandomString(char *string)
使用malloc
动态分配字符串,填充字符串,并按malloc
返回返回的地址。此返回的地址是从堆中分配的,并将被分配,直到您不手动释放它(或程序没有终止)。
char *getRandomString(void)
{
char *word;
word = malloc (sizeof (random_length));
// ...instructions that will fill word with random characters.
return word;
}
完成分配的字符串后,请记住释放字符串。
或者可以做另外的事情,如果你不能使用malloc
将getRandomString
中的本地字符串定义为static
,这使得静态声明的数组的生命周期与程序一样长运行。
char *getRandomString(void)
{
static char word[LENGTH];
// ...instructions that will fill word with random characters.
return word;
}
或者只是将char word[128];
全局。
答案 2 :(得分:0)
你的两个例子都返回指向局部变量的指针 - 这通常是禁止的。如果没有malloc()
stdio.h
中没有定义word
,您将无法为调用者创建内存,因此我想您唯一的选择是使main()
成为静态或全局,除非你可以在stdio.h
中声明它并将指针传递给你要填写的随机字符串函数。你如何只用{{1}}中的函数生成随机数?
答案 3 :(得分:0)
据我了解,malloc不是一种选择。
写一些函数给a)得到一个随机整数(字符串长度),和b)一个随机字符。
然后使用它们来构建随机字符串。
例如:
//pseudocode
static char random_string[MAX_STRING_LEN];
char *getRandomString()
{
unsigned int r = random_number();
for (i=0;i<r;i++){
random_string[i] = random_char();
}
random_string[r-1] = '\0';
}
答案 4 :(得分:0)
如果不允许使用malloc
,则必须在文件范围内声明一个可能是最大可能大小的数组,并用随机字符填充它。
#define MAX_RANDOM_STRING_LENGTH 1024
char RandomStringArray[MAX_RANDOM_STRING_LENGTH];
char *getRandomString(size_t length)
{
if( length > ( MAX_RANDOM_STRING_LENGTH - 1 ) ) {
return NULL; //or handle this condition some other way
} else {
// fill 'length' bytes in RandomStringArray with random characters.
RandomStringArray[length] = '\0';
return &RandomStringArray[0];
}
}
int main()
{
char *string = getRandomString(100);
printf("Random string is: %s\n", string);
return 0;
}