打印功能打印一些奇怪的字符

时间:2020-05-07 10:39:13

标签: c arrays string pointers random

我正在尝试使用此功能创建随机字符串:

static char *rand_string(char *str)
{   
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
    int i;

    for ( i = 0; i < 10; i++) 
    {
        int key = rand() % (int) (sizeof charset - 1);
        str[i] = charset[key];
    }
        str[11] = '\0';

    return str;
}

问题是这样的:有时当我要打印指针时,它会显示一些奇怪的字符,如下所示: bug 如您所见,在第一次启动时,字符串中的字符为10,在第二次和第三次启动中,字符串中的字符为11 ...

这是我的程序:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

static char *rand_string(char *str);


int main() 
{

    char *string, //str
         *string_result; //str1


    int dimensione= 15,
        i;

    for(i=0;i<dimensione;i++)
    {
        string_result = rand_string(string);
        printf("%s\n", string_result);

    }
}


static char *rand_string(char *str)
{   
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
    int i;

    for ( i = 0; i < 10; i++) 
    {
        int key = rand() % (int) (sizeof charset - 1);
        str[i] = charset[key];
    }
        str[11] = '\0';

    return str;
}

您可以在此处查看和测试我的代码-> https://onlinegdb.com/r1yY8DWc8

1 个答案:

答案 0 :(得分:0)

您的整个代码都会调用未定义的行为,因为您传递了string,这是一个未初始化的指针,对于在rand_string()函数中访问的11个字节,可能“不能”保证对其进行访问。

您需要从main()分配内存,并将该缓冲区传递给随机字符串生成器函数填充,这样您就可以控制要修改的内存。

此外,生成器中的for循环已经填充了从09的索引。要将最后一个字节设置为NULL,您需要使用索引10。

标头time.hunistd.h在这里也没有用。这是通过malloc()分配的相同程序的重写。还将函数rand_string()修改为void而不是返回字符串。

#include <stdio.h>
#include <stdlib.h>

void rand_string(char *str);


int main() 
{

    int dimensione= 15;

    char *string = malloc(11 * sizeof *string); // extra byte for NULL

    if (!string) return 1;
    int i;

    for(i=0;i<dimensione;i++)
    {
        rand_string(string);
        printf("%s\n", string);
    }

    free(string);
    return 0;
}


void rand_string(char *str)
{   
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
    int i;

    for ( i = 0; i < 10; i++) 
    {
        int key = rand() % (int) (sizeof charset - 1);
        str[i] = charset[key];
    }
        str[10] = '\0';
}

始终使用额外的标志进行编译,以启用来自编译器的各种警告。例如与gcc一起使用时,请始终添加-Wall -Wextra来查看可以从侧面解决的警告。