我需要将函数的输出重定向到变量,以便稍后调用。 我不希望显示函数输出,除了变量。 这是我的代码:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char str[] = "0123456789ABCDEF";
int length;
unsigned long int hxrnd()
{
while(length--)
{
putchar(str[rand() % 16]);
srand(rand());
}
}
int main(void)
{
printf ("\n======================\n Simple Psuedo Random\n Hex Key Generator\n======================\n");
srand((unsigned int) time(0) + getpid());
length = 16;
int x = hxrnd();
printf("\n%d\n", x);
length = 10;
int y = hxrnd();
printf("\n%d\n===================\n\n", y);
return 0;
}
事实上,函数的输出显示,变量返回0。正如你所知,我对编程不太了解。
好吧,你错了很多,但让我们一一来说吧。
您的
hxrnd()
没有 return
语句 - 因此它无法返回任何内容来分配给 x
或 y
。
您只能在首次使用
srand()
之前的 main()
中调用 rand()
一次。
您尝试从
str[]
创建随机十六进制字符串,但无法将字符保存在 hxrnd()
中的任何缓冲区中,或者无法保留最终十六进制值的运行总计。
(避免使用全局变量,根据需要将参数传递给函数)
如果我理解你的目标,你可以通过使用随机十六进制字符构建字符串来修复
hxrnd()
,然后调用strtoul()
将随机字符串转换为返回值。 (您还应该通过 strtoul()
验证转换——我留给您)。
将所有部分放在一起,您可以执行类似于以下的操作。请注意,VLA 用作缓冲区,但您可以通过声明数组足够长来使用普通的旧数组,以容纳 nul 终止字符的最大字符数 +1。
也就是说,你可以这样做:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#define BASE 16 /* if you need a constant, #define one or more */
unsigned long int hxrnd (const char *str, size_t len)
{
char buffer[len * 2]; /* variable length array */
int index = 0; /* index to fill in buffer */
while (len--) /* loop length times */
{
int c = str[rand() % BASE]; /* get char from string */
while (index == 0 && c == 0) { /* avoid leading 0 */
c = str[rand() % BASE];
}
buffer[index] = c; /* save char in buffer at index */
putchar(buffer[index]); /* output your char (optional) */
index += 1; /* increment index */
}
putchar ('\n'); /* tidy up with newline */
buffer[index] = 0; /* nul-terminate buffer */
return strtoul (buffer, NULL, BASE); /* convert to base-16 unsigned and return */
}
int main (void)
{
char str[] = "0123456789ABCDEF"; /* avoid globals, pass parameters */
size_t length = strlen (str); /* use strlen() for string length */
unsigned long x = 0, /* initialize all variables */
y = 0;
srand((unsigned int) time(0) + getpid()); /* call srand() once */
printf ("\n======================\n Simple Psuedo Random\n Hex Key Generator\n======================\n");
x = hxrnd (str, length); /* strtoul() validation omitted */
printf("\nx: %lu\n\n", x);
length = 10;
y = hxrnd (str, length); /* strtoul() validation omitted */
printf("\ny: %lu\n===================\n\n", y);
}
(注意:对
index == 0 && c == 0
的测试是为了防止第一个十六进制字符被随机选择为0
)
最重要的是,学会在启用警告的情况下进行编译,并且不要接受代码,直到代码在没有警告的情况下编译。要启用警告,请将
-Wall -Wextra -pedantic
添加到您的 gcc/clang
编译字符串(还可以考虑添加 -Wshadow
以对隐藏变量发出警告,并添加 -Werror
将警告视为错误)。对于 VS(Windows 上为 cl.exe
),请使用 /W3
。所有其他编译器都会有类似的选项。阅读并理解每个警告——然后修复它。警告将识别任何问题以及问题发生的确切行。通过聆听编译器告诉您的内容,您可以学到很多东西。
示例使用/输出
用gcc编译:
您的来源在
randhexstr.c
gcc -Wall -Wextra -pedantic -Wshadow -Werror -std=c11 -Ofast -o randhexstr randhexstr.c
示例输出
$ ./randhexstr
======================
Simple Psuedo Random
Hex Key Generator
======================
BB61D5D9C37E6A74
x: 13502308289097919092
B2A61B5621
y: 767290988065
===================
阅读代码中包含的注释,如果您还有其他问题,请告诉我。