gpt4 book ai didi

c - 根据 z 的长度返回 x 个 y 个字符

转载 作者:太空宇宙 更新时间:2023-11-04 00:36:11 25 4
gpt4 key购买 nike

现在我正在尝试创建一个函数,它接受一个字符串和一个字符的长度,它应该输出 x 个字符。

例如:

// char *string = "Hello"; (not actual code)
get_chars(strlen(string), "*"); // #=> *****

但我不断遇到转换错误,而且我根本找不到解决问题的方法。我使用的函数是:

char
*get_chars(int number, char *ch)
{
int i = 0;
char buffer[number];

for (i; i < number; i++)
{
buffer[i] = ch;
}

return buffer;
}

调用时产生:

assignment makes integer from pointer without a cast

最佳答案

首先让我们检查一下函数的参数:

char *get_chars(int number, char *ch)

好的,我们有一个方法接受一个数字,一个指向 char 的指针,并返回一个指向 char 的指针。现在该方法的目的是生成一个由重复 number 次的相同 char 组成的字符串,那么为什么要传递 char* 而不是那是一个 char?

传递 char* 是没有意义的,除非你真的想将指针传递给现有的单个 char 而不是直接传递字符,但我不在你的情况下看不出有任何理由这样做,所以你的签名应该成为

char* get_chars(int number, char ch)

现在,buffer[i] = ch; 赋值不会产生任何问题,而且您的转换错误也消失了。

然后让我们看看函数内部发生了什么:

char buffer[number];
...
return buffer;

因此,一个变长数组被创建为堆栈上的局部变量,然后它的地址衰减为一个 char* 指针,并被返回。但是从函数返回后,本地堆栈被清除,你刚刚返回的地址不再有任何意义。在这里你可以有两种解决方案:

  • 传递一个 char* 由方法填充(并由调用者分配)
  • 在被调用者中分配内存,然后您需要释放

第一个解决方案转化为:

void get_chars(char* buffer, int length, char ch) {
...
}

虽然第二种解决方案是这样的:

char* get_chars(int length, char ch) {
char* buffer = calloc(length+1, 1);
...
return buffer;
}

请注意,我使用的是 length+1,因为 C 字符串应该由 \0 终止,否则任何库函数都无法知道它结束的地方。

关于c - 根据 z 的长度返回 x 个 y 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35050545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com