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 
#include          //rand(),srand()
#include            //time()
#include          //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 
#include          //rand(),srand()
#include            //time()
#include          //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

你可能感兴趣的:(C/C++)