如何在int safecpy(char ** t,char * s)中使用双指针和printf?

时间:2019-01-14 13:21:32

标签: c arrays pointers copy

我正在尝试实现“ 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和双指针的用法在这里是否正确。

3 个答案:

答案 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)

此处ts是指向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作为输入数组