C语言基础-生成任意长度的字符串

序言

在C语言编程中,有时候需要生成任意长度的字符串以供使用。文章给出任意长度字符串(包含字母和数字)生成的简单程序。

指针实现

  • 主函数如下
char *randstr(char *pointer, int n)
{
    int i,randnum;
    char str_array[63] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for (i = 0; i < n; i++)
    {
        randnum = rand()%62;                    //随机数生成函数
        *pointer = str_array[randnum];          //从字符数组中取值
        pointer++;
    }
    *pointer = '\0';                            //字符串结束符
    return (pointer - n);                       //返回指向随机字符串的指针首地址
}

rand()为虽然为随机数生成函数,但由于每次执行前未设置随机数种子,所以生成的随机数实际为伪随机数-每次相同,为了生成真正的随机数,我们采用srand()函数来设置随机数种子,通常以时间作为随机数种子。

  • 将主函数修改如下
char *randstr(char *pointer, int n)
{
    int i,randnum;
    char str_array[63] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for (i = 0; i < n; i++)
    {
        srand(time(NULL));                    //以当前时间来设置随机数种子
        usleep(100000);                       //每隔100ms更新一次时间
        randnum = rand()%62;                  //随机数生成函数
        *pointer = str_array[randnum];        //从字符数组中取值
        pointer++;
    }
    *pointer = '\0';
    return (pointer - n);
}

rand()和srand()函数需要添加头文件stdlib.h,time()函数需要添加头文件time.h,usleep()函数需要添加头文件unistd.h

  • 完整程序如下
#include <stdio.h>
#include <stdlib.h>         //rand(),srand()
#include <time.h>           //time()
#include <unistd.h>         //sleep()

//随机字符串生成函数声明
char *randstr(char *pointer, int n);

int main()
{
    char *payload;
    payload = (char *)malloc(sizeof(char) * 100);
    int n = 50;                                        //设置字符串长度
    printf("%c\n", *(strn(payload, n)));               //输出随机生成的第一个字符
    free(payload);                                     //释放堆空间
    return 0;
}

char *randstr(char *pointer, int n)
{
    int i,randno;
    char str_array[63] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for (i = 0; i < n; i++)
    {
        srand(time(NULL));
        sleep(1);                        //每隔1s更新一次时间
        randnum = rand()%62;
        printf("%d\n", randnum);         //检查每次生成的随机数
        *pointer = str_array[randnum];   //从字符数组中取值
        pointer++;
    }
    *pointer = '\0';
    return (pointer - n);
}

数组实现

有时候我们需要生成任意长度的字符串并给到数组,用指针操作不是很直接,可以使用数组来实现

  • 主函数如下
char *randstr(char str[], int n)
{
    int i,randum;
    char str_array[63] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for (i = 0; i < n; i++)
    {
        srand(time(NULL));
        //usleep(100000);
        randnum = rand()%62;
        printf("%d\n", randnum);
        str[i] = str_array[randnum];     //数组作为函数参数退化为指针,
    }
    str[n] = '\0';
    return str;                          //这个时候直接返回数组首地址
}
  • 完整程序如下
#include <stdio.h>
#include <stdlib.h>         //rand(),srand()
#include <time.h>           //time()
#include <unistd.h>         //sleep()

//随机字符串生成函数声明
char *randstr(char str[], int n);

int main()
{
    char payload[100];
    int n = 50;
    randstr(payload,n);                     //函数调用
    printf("%c\n", payload[2]);             //输出任意元素
    return 0;
}

char *randstr(char str[], int n)
{
    int i,randnum;
    char str_array[63] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for (i = 0; i < n; i++)
    {
        //srand(time(NULL));
        //sleep(1);
        randnum = rand()%62;
        str[i] = str_array[randnum];
    }
    str[n] = '\0';                          //字符串结束符
    return str;
}

用数组操作时,数组作为实参传入函数。看到很多地方说:数组作为实参传入函数退化为指针?但是在本程序示例中在函数内对数组进行直接赋值并没有什么问题,所以暂时还不是很理解为什么说退化为了指针。



Acknowledgements:
http://blog.csdn.net/ericzhangyuncsdn/article/details/58604687

2017.06.02

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的问题,需要分多个步骤来实现。我会尽力解答,但是由于长度限制,可能无法提供完整的代码实现,还请谅解。 首先,需要了解哈夫曼编码的基本原理。哈夫曼编码是一种变长编码方式,将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,以达到压缩数据的目的。在哈夫曼编码中,使用哈夫曼树来表示每个字符的编码。 接下来,我们可以按照以下步骤来实现哈夫曼编译器: 1. 定义一个结构体来表示每个字符及其出现的概率: ``` typedef struct { char ch; // 字符 float prob; // 出现概率 char code[256]; // 哈夫曼编码 } HuffmanNode; ``` 2. 编写一个函数来统计输入字符串中每个字符出现的概率,并将结果存储在一个数组中: ``` void calc_prob(char *str, HuffmanNode *nodes, int *count) { int len = strlen(str); for (int i = 0; i < len; i++) { char ch = str[i]; count[ch]++; } for (int i = 0; i < 256; i++) { if (count[i] > 0) { nodes[*num_nodes].ch = i; nodes[*num_nodes].prob = (float)count[i] / len; (*num_nodes)++; } } } ``` 3. 构建哈夫曼树,按照字符出现概率从小到大排序,并将概率较小的字符作为叶子节点,概率较大的字符作为根节点: ``` void build_tree(HuffmanNode *nodes, int num_nodes) { for (int i = 0; i < num_nodes - 1; i++) { int min1 = -1, min2 = -1; for (int j = 0; j < num_nodes; j++) { if (nodes[j].parent == -1) { if (min1 == -1 || nodes[j].prob < nodes[min1].prob) { min2 = min1; min1 = j; } else if (min2 == -1 || nodes[j].prob < nodes[min2].prob) { min2 = j; } } } nodes[min1].parent = num_nodes + i; nodes[min2].parent = num_nodes + i; nodes[num_nodes + i].left = min1; nodes[num_nodes + i].right = min2; nodes[num_nodes + i].prob = nodes[min1].prob + nodes[min2].prob; } } ``` 4. 根据哈夫曼树生成每个字符的哈夫曼编码: ``` void generate_code(HuffmanNode *nodes, int root, char *buffer, int depth) { if (nodes[root].left == -1 && nodes[root].right == -1) { buffer[depth] = '\0'; strcpy(nodes[root].code, buffer); return; } buffer[depth] = '0'; generate_code(nodes, nodes[root].left, buffer, depth + 1); buffer[depth] = '1'; generate_code(nodes, nodes[root].right, buffer, depth + 1); } ``` 5. 输入任意字符串,将每个字符编码,并输出译码结果: ``` void encode_string(char *str, HuffmanNode *nodes, int num_nodes) { int len = strlen(str); for (int i = 0; i < len; i++) { char ch = str[i]; for (int j = 0; j < num_nodes; j++) { if (nodes[j].ch == ch) { printf("%s", nodes[j].code); break; } } } printf("\n"); } ``` 以上是一个基本的哈夫曼编译器的实现步骤,具体实现细节还需要根据实际情况进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值