首页 > 解决方案 > 在 C 中使用 strcpy() 函数

问题描述

我目前是编程新手,并且正在学习我们学院正在教给我们的 C 语言。strcpy()我对头文件下函数的实际功能有疑问#include<strings.h>

该功能的一般用途如下 -

#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;
}

我对此有几个疑问-

  1. 函数中的额外指针 ( temp ) 要求是什么?我们不能return to;在函数的末尾吗?

  2. 我说服自己使用了 temp 变量,因为在每个 while 循环期间,指针to都会自行改变。即首先*to将被分配*from,然后to = to +1,from = from +1将发生,这将导致更改存储在指针中的地址to。但如果这是真的,那么指针from呢?strcpy()请问,它在函数结束时也不会改变吗?

  3. 返回存储在 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);   
}

请帮我澄清我的疑问。

标签: cstrcpy

解决方案


  1. 见2

  2. strcpy 的实现要求返回一个指向目标字符串开头的指针。因此,如果您想以与 相同的方式实现您的函数,则strcpy必须保存作为参数传递的原始指针的副本,以防您打算在函数内更改该参数。这不是一个特别有用或合理的功能,但 strcpy 从一开始就是这样。

  3. 不明白你的意思; 这里显然:return temp;

  4. return to;是错的。您必须意识到无论调用者是否使用该值,该函数都会返回一个值。严格的编译器可能会警告“未使用函数的值”,在这种情况下,您必须编写(void) strcpy(a,b);以使其静音。由于您的示例不使用返回的值,所以它是错误的并不重要。


推荐阅读