我正在尝试实现“ int safecpy(char ** t,char * s)”函数,该函数用于将数组复制到另一个数组中。我实际上在使用双指针时遇到了一些麻烦。该函数返回1表示成功,返回0表示错误。 我实际上想对复制的数组进行printf,但是我总是被卡住,或者最后没有显示该数组。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int safecpy(char **t, char *s);
int main (void)
{
char *t, *v, i;
char s[] = "abcd";
if (safecpy(&t, &s) == NULL)
{
printf("No memory.");
return 1;
}
printf("The copied Array:");
for(i = 0; i < 4; i++)
{
printf("%i", t[i]);
}
free(t);
return 0;
}
int safecpy(char **t, char *s)
{
int i;
*t = malloc(strlen(s+1)*sizeof(char));
if (*t == NULL)
{
return NULL;
}
for(i = 0; i < (strlen(s)+1); i++)
{
*t[i] = s[i];
printf("i = %i\n", i);
}
return 1;
}
我尝试将*t[i] = s[i];
更改为t[i] = s[i];
。然后for贯穿了整个过程,但是现在我仍然无法打印t
。
当我使用*t[i]
运行时,它在i = i
之后卡住了,我不知道原因。然后我也不确定整个printf
和双指针的用法在这里是否正确。
答案 0 :(得分:1)
您可以先更改
*t = malloc(strlen(s+1)*sizeof(char));
到
*t = malloc(strlen(s) + 1);
为
sizeof(char)
确保为C的1。毫无意义地将其用作乘数。strlen(s+1)
实际上与您的想法完全相反。您需要在字符串长度上加上1(返回值strlen()
),而不是从初始元素开始算一。也就是说,根据operator precedence,数组下标在指针取消引用运算符之前进行绑定,因此您需要使用括号强制执行绑定,因为您希望将语句解析为
(*t)[i] = s[i]; // you want to index over the memory pointed to by (*t)
不是
*(t[i]) = s[i]; // default parsing without forced precedence.
其他几点:
if (safecpy(&t, &s) == NULL)
更改为if (safecpy(&t, s) == 0)
,因为safecpy()
的第二个参数在作为函数传递时需要一个char *
和一个数组名。参数,衰减为指向emenelnt类型的指针,在这种情况下为char *
。 &array
的类型为char (*)[n]
,与char *
不同。另外,当函数重新调整int
时,您需要根据int
值对其进行检查。return NULL;
函数中将return 0;
更改为safecpy()
,它返回一个int
,而不是一个指针。main()
中,将i
定义为char
对您不利,将其更改为int
。v
尚未使用,您可以摆脱它。在您的main()
中,代码段
printf("The copied Array:");
for(i = 0; i < 4; i++)
{
printf("%i", t[i]);
}
必须更改为
printf("The copied Array:");
for(i = 0; i < strlen(s); i++) //don't use magic numbers
{
printf("%c", t[i]); // you want to see 'char' values, not `int` values
}
答案 1 :(得分:0)
首先,您的意思是
*t = malloc(strlen(s+1) * sizeof(char));
或
*t = malloc((strlen(s) + 1) * sizeof(char);
?
因为strlen(s+1)
等于strlen(s) - 1
。
关于您的问题,请尝试使用(*t)[1]
,以便将char**
解除对char*
的引用,然后使用成员访问运算符char
解除对[]
的引用。 / p>
答案 2 :(得分:0)
int safecpy(char **t, char *s)
这似乎是错误的
char *t, *v, i;
char s[] = "abcd";
if (safecpy(&t, &s) == NULL)
此处t
和s
是指向char (char *)
的指针,因此,当您传递指向该指针的指针时,结果类型为char **
。您需要更改函数头
int safecpy(char **t, char *s)
到
int safecpy(char **t, char **s)
或者另一种方法是在函数调用中将&s
更改为s
:
if (safecpy(&t, &s) == NULL)
我认为您可能希望将&s
更改为s
,因为您在safecpy函数中使用s
作为输入数组