【发布时间】:2021-08-12 17:32:48
【问题描述】:
我目前是编程新手,并且正在学习我们学院教授给我们的 C 语言。
我对头文件#include<strings.h>下的strcpy()函数的实际功能有疑问
下面给出这个函数的一般用法-
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char a[] = "google";
char *b = (char*)malloc((strlen(a) +1)*sizeof(char));
strcpy(b,a);
printf("%s, %s\n", a, b); //prints google, google
free(b);
}
我们给出的格式和原型相同:
char *strcpy( char *to, const char *from)
{
char *temp = to;
while (*to++ = *from++);
return temp;
}
我对此有几个疑问-
-
函数中的额外指针 ( temp ) 要求是什么?我们不能在函数的末尾直接
return to;吗? -
我说服自己使用了 temp 变量,因为在每个 while 循环中,指针
to都会自行改变。即首先*to将被分配*from,然后to = to +1和from = from +1将发生,这将导致更改存储在指针to中的地址。但如果这是真的,那么指针from呢?请问,strcpy()函数结束时它也不会改变吗? -
返回存储在 temp 中的地址的函数在哪里? (该功能只有在
b = strcpy(b,a);不仅被提及strcpy(b,a);时才有效)
为了检查给定的函数,我还创建了自己的函数“strcpy_me”,并以相同的格式和原型使用它,它给出了相同的结果。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *strcpy_me( char *to, const char *from)
{
char *temp = to;
while (*to++ = *from++);
return temp;
}
int main()
{
char a[] = "google";
char *b = (char*)malloc((strlen(a) +1)*sizeof(char));
strcpy_me(b,a);
printf("%s, %s\n", a, b); // prints google, google
free(b);
}
请帮我澄清我的疑问。
【问题讨论】:
-
1)
to改变了函数内的值;您可以返回更改后的值...但是调用函数对此没有用。 2) 正确。 local 指针from将在函数内部发生变化:外部没有其他变量发生变化。 3) 返回temp可以让你做strcpy(foo, strcpy(bar, "quux"));4) 有问题吗? -
1.第二点给出的理由是正确的。 2.
from指针呢?它确实改变了,但为什么这是一个问题? 3. 返回值存储在您选择的存储位置。不清楚你在问什么。 -
@pmg
from不仅仅是一个本地指针。它是字符串 a 的地址。我相信,当我们通过引用(而不是通过值)调用此函数时,最后我们的 char *a 将指向 NULL 而不是“google”的第一个字符。因此,在main函数中打印a时,应该什么都不给,而不是打印 'google' 回来。如果我错了,请纠正我。 -
sizeof(char)定义为 1,在 C 中从malloc()返回不需要强制转换 -
旁白:不需要演员表。被引用对象的大小。
char *b = (char*)malloc((strlen(a) +1)*sizeof(char));-->char *b = malloc(sizeof *b * (strlen(a) +1));