现在我正在尝试创建一个接受字符串和字符长度的函数,它应该输出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
答案 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)
buffer
是char
因此,buffer[i]
是char
。
但ch
是char *
。
所以buffer[i] = ch
会抛出错误。
将ch
更改为char
并相应地传递值('*'
而不是"*"
),或buffer[i] = ch[0]
。
无论如何,你不能只返回buffer
;当函数结束时它就被破坏了。
答案 2 :(得分:0)
将char *ch
更改为char ch
,将您的来电从get_chars(strlen(string), "*");
更改为get_chars(strlen(string), '*');
。