【问题标题】:Print function print some strange chars打印功能打印一些奇怪的字符
【发布时间】:2020-08-22 15:04:06
【问题描述】:

我正在尝试使用此函数创建一个随机字符串:

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;
}

问题是这样的:有时当我要打印指针时,它会显示一些奇怪的字符,如下所示: 如您所见,在第一次启动时,字符串中的字符为 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

【问题讨论】:

  • 你是否选择了正确的索引来结束rand_string中的字符串?
  • 你不应该这样做str[10] = '\0'
  • @PeterO。我想是的......
  • @Inian 你能解释一下吗?
  • @Inian 您删除了代码,但这是正确的方法!谢谢你,我已经接受了,但我们可以与社区分享!

标签: c arrays string pointers random


【解决方案1】:

您的整个代码调用了未定义的行为,因为您传递了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 以查看您可以从您身边修复的警告。

【讨论】:

  • 嘿,谢谢你重写了我的代码!真的很有帮助!不幸的是,每个函数我只能使用一个“返回”......“我们”如何解决它?
  • 等等...我可以使用 ELSE 而不是 return 1 !
  • 谢谢你,这是正确的做法!我的代码很糟糕:D
  • 嘿伙计,最后的东西只是为了理解。我需要捕获函数“rand_string”的结果值...我将其声明为:char *rand_string(char *str)。我添加了“return str;”最后...这意味着我只需要声明一个 char 指针就可以捕获返回值?
  • 您不必为您的要求返回一个字符串。但如果你还是坚持,你可以照你说的做。但我不会那样设计它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多