【问题标题】:Using strcpy() function in C在 C 中使用 strcpy() 函数
【发布时间】: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;
}

我对此有几个疑问-

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

  2. 我说服自己使用了 temp 变量,因为在每个 while 循环中,指针 to 都会自行改变。即首先*to 将被分配*from,然后to = to +1from = 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);   
}

请帮我澄清我的疑问。

【问题讨论】:

  • 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));

标签: c strcpy


【解决方案1】:
  1. 见 2

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

  3. 不知道你的意思;显然在这里:return temp;

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

【讨论】:

  • 2.好的,我明白你的观点 3。我的意思是该函数只是返回目标字符串的地址,但它没有存储在任何地方。我相信返回的 char * 应该存储为 b = strcpy(b, a); 而不仅仅是命令 strcpy(b, a); 4.是的,对不起,我更正了。我用它来看看在这种情况下会发生什么return to;
  • @granthium 目标字符串是b 本身。没有必要做b = b。你只需要执行strcpy(b, a)
  • @granthium 你可以忽略strcpy 的返回值,因为你知道它会返回什么。我相信这样做的原因是允许像 strcat(strcpy(dest, "foo"), "bar") 这样的函数调用链接,这在 1970 年代可能被认为是合理的编程风格。
【解决方案2】:
  1. 你认为没有。 2 是正确的。

  2. from 确实发生了变化,但我们不需要 from 的先前值。 to 存储在 temp 中,因为应该返回 to 的原始值,所以我们需要它但不需要 from

  3. 不,您不需要这样做。您可以忽略 C 中的返回值(在大多数情况下也没有警告)。没有返回工作,因为*to = *from 也改变了参数的内存,在这种情况下,b。因此,*to = *from 直接更改数组 b。这是因为tob存储的是同一个内存。

注意:在您的 while 循环中,它是 *to++ = *from++。它使用后加法,为简化起见,我没有在此处包含,但它所做的只是在操作后同时增加 tofrom

  1. 正如我在 3 中所说,您不需要返回值。事实上,由于原来的totempb指向同一个内存,所以函数本身就返回了b。这样做,b = strcpy_me(b, a) 等同于:

     strcpy(b, a);
     b = b; //b's value stays the same
    

是的,return temp; 在我看来绝对是垃圾。它只会引起混乱。

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2020-08-16
    • 2015-01-27
    • 2021-11-11
    • 2013-10-18
    • 2012-09-15
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多