c - 如何在 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
双指针的整体和使用在这里是否正确。
解决方案
你可以从改变开始
*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
将是 typechar (*)[n]
,这与char *
. 此外,当函数返回 anint
时,您需要根据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 }
推荐阅读
- laravel - 多对多数据透视表上的自定义范围
- flutter - 断言失败:第 19 行第 16 行:'纬度!= null':不正确。颤振错误
- javascript - 我可以用更新的 Object.fromEntries(new FormData(form)) 替换表单元素循环解析吗?
- sql-server - SQL Server:连接到服务器时出现错误 26
- linux - 如何仅在脚本完成后获取多个命令的执行时间?
- laravel - 使用 groupBy 从 mySQL 获取数据时 Laravel 错误
- node.js - AWS 弹性 beanstalk 上的默认代理配置将请求转发到的 Web 应用程序的端口号是多少?
- python - Python函数接受一个字符串,但不是当它在一个变量中
- reactjs - 如何在反应中反序列化ArrayObject的数据
- ubuntu - Rust Ubuntu 20.04.1 安装问题