基于z的长度返回x个y个字符

Ben*_*ams 1 c

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

例如:

// char *string = "Hello"; (not actual code)
get_chars(strlen(string), "*"); // #=> *****
Run Code Online (Sandbox Code Playgroud)

但我一直在犯错误,我根本无法找到问题的解决方案.我正在使用的功能是:

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

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

    return buffer;
}
Run Code Online (Sandbox Code Playgroud)

当被调用时,产生:

assignment makes integer from pointer without a cast
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 6

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

char *get_chars(int number, char *ch)
Run Code Online (Sandbox Code Playgroud)

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

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

char* get_chars(int number, char ch)
Run Code Online (Sandbox Code Playgroud)

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

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

char buffer[number];
...
return buffer;
Run Code Online (Sandbox Code Playgroud)

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

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

第一个解决方案转换为:

void get_chars(char* buffer, int length, char ch) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

char* get_chars(int length, char ch) {
  char* buffer = calloc(length+1, 1);
  ...
  return buffer;
}
Run Code Online (Sandbox Code Playgroud)

请注意我正在使用,length+1因为C字符串应该被NUL终止,\0或者任何库函数都无法知道它的结束位置.