根据z

时间:2016-01-28 00:00:10

标签: c

现在我正在尝试创建一个接受字符串和字符长度的函数,它应该输出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

3 个答案:

答案 0 :(得分:6)

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

char *get_chars(int number, char *ch)

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

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

char* get_chars(int number, char ch)

现在,buffer[i] = ch;分配不会产生任何问题,并且您的施法错误也会消失。

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

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

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

  • 传递char*以由方法填充(并由调用者分配)
  • 在被调用者中分配内存,然后你需要free

第一个解决方案转换为:

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终止,或者任何库函数都无法知道它的结束位置。

答案 1 :(得分:1)

bufferchar

的数组

因此,buffer[i]char

chchar *

所以buffer[i] = ch会抛出错误。

ch更改为char并相应地传递值('*'而不是"*"),或buffer[i] = ch[0]

无论如何,你不能只返回buffer;当函数结束时它就被破坏了。

答案 2 :(得分:0)

char *ch更改为char ch,将您的来电从get_chars(strlen(string), "*");更改为get_chars(strlen(string), '*');