首页 > 解决方案 > 如何在 int safecpy(char **t, char *s) 中使用双指针和 printf?

问题描述

我正在尝试实现函数“int safecpy(char **t, char *s)”,它用于将一个数组复制到另一个数组中。实际上,我在使用双指针时遇到了一些麻烦。该函数返回 1 表示成功,0 表示错误。我实际上想打印复制的数组,但我总是卡住,或者最后甚至没有显示数组。

#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双指针的整体和使用在这里是否正确。

标签: carrayspointerscopy

解决方案


你可以从改变开始

 *t = malloc(strlen(s+1)*sizeof(char));

*t = malloc(strlen(s) + 1);

作为

  • sizeof(char)在 C 中保证为 1。使用它作为乘数毫无意义。
  • strlen(s+1)实际上与您的想法完全相反。您需要将字符串长度(的返回值strlen())加 1,而不是从初始元素开始计数。

也就是说,根据运算符优先级,数组下标在指针取消引用运算符之前绑定,因此您需要使用括号明确地强制绑定,因为您希望将语句解析为

(*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将是 type char (*)[n],这与char *. 此外,当函数返回 anint时,您需要根据int值检查它。
  • 在函数中更改return NULL;为,它返回一个,而不是指针。return 0;safecpy()int
  • main(),定义ichar你不好,将其更改为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
    }
    

推荐阅读