将函数的输出重定向到变量

问题描述 投票:0回答:1

我需要将函数的输出重定向到变量,以便稍后调用。 我不希望显示函数输出,除了变量。 这是我的代码:

#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。正如你所知,我对编程不太了解。

c function variables output
1个回答
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
===================

阅读代码中包含的注释,如果您还有其他问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.