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

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

我想用这个函数创建一个随机字符串。

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.comr1yY8DWc8

c arrays string pointers random
1个回答
0
投票

你的整个代码都在调用未定义的行为,因为你在传递 string 是一个未初始化的指针,它可能 "不保证 "你在 rand_string() 函数。

你需要从 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 来看看你这边可以修复的警告。

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