如何将C语言函数输出重定向至变量而非直接显示?
C语言将随机十六进制生成函数的输出存入变量的解决方案
问题现状
当前代码中hxrnd()函数通过putchar()直接向终端输出十六进制字符,无法将结果存入变量;同时函数声明为unsigned long int却未编写return语句,导致x、y获取到的返回值为0(未定义行为下的随机结果)。需要修改函数逻辑,让生成的十六进制内容存入变量而非直接输出。
原代码的核心问题:
- 使用全局变量
length,容易引发不可控的逻辑副作用 - 函数通过
putchar()直接输出,无法捕获生成结果 - 函数无返回语句,返回值未定义
- 循环内反复调用
srand(rand()),会打乱随机数生成的正常序列
修改方案
核心思路
- 替换直接输出为缓冲区写入:让函数接收字符串缓冲区和长度参数,将生成的十六进制字符写入缓冲区
- 移除全局变量:将
length作为函数参数传入,消除全局变量的副作用 - 修正随机数生成逻辑:仅在程序初始化时调用一次
srand(),循环内不再重复调用 - 确保字符串合法性:在生成的字符末尾添加字符串结束符
'\0'
修改后的完整代码
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> const char str[] = "0123456789ABCDEF"; // 将生成的length位十六进制字符串存入buf,buf需提前分配足够空间(length+1) void hxrnd(char *buf, int length) { for (int i = 0; i < length; i++) { buf[i] = str[rand() % 16]; } // 添加字符串结束符,保证buf是合法的C字符串 buf[length] = '\0'; } int main(void) { printf("======================\n Simple Psuedo Random\n Hex Key Generator\n======================\n"); // 仅初始化一次随机数种子,避免破坏随机序列 srand((unsigned int)time(0) + getpid()); // 分配存储16位十六进制字符串的缓冲区(+1用于存结束符) char x_buf[17]; hxrnd(x_buf, 16); printf("\n16位密钥:%s\n", x_buf); // 分配存储10位十六进制字符串的缓冲区 char y_buf[11]; hxrnd(y_buf, 10); printf("\n10位密钥:%s\n===================\n", y_buf); // 如果需要将字符串转为数值类型(比如unsigned long),可以用strtoul // unsigned long x_val = strtoul(x_buf, NULL, 16); // printf("16位密钥对应的数值:%lu\n", x_val); return 0; }
代码说明
hxrnd()函数现在通过参数接收结果缓冲区和生成长度,直接将字符写入缓冲区,不再直接输出到终端- 移除全局变量
length,改用参数传递,逻辑更清晰且无副作用 - 随机数种子仅在
main开头初始化一次,避免循环内反复调用srand()导致随机序列失效 - 每个缓冲区末尾添加
'\0',确保生成的内容是合法的C字符串,方便后续输出或其他字符串操作
内容的提问来源于stack exchange,提问作者cppcdude
相关产品推荐
相关产品推荐

