【问题标题】:Strcpy() function parametersstrcpy() 函数参数
【发布时间】:2018-07-19 09:40:20
【问题描述】:

我经常使用函数strcpy() 来完成一项任务。查看strcpy()的函数原型:

char *strcpy(char *dest, const char *src)

可以看出strcpy()接受了两个指针。

但是,我在网上的很多示例以及我自己的代码中看到,可以通过以下方式复制字符串并且它会起作用:

char array[30];
strcpy(array, "mystring");
printf("%s\n", array);

我的问题是,如果您传递的第二个参数是字符串,为什么 strcpy() 会起作用?第二个参数不需要是指向字符串的指针吗?例如。您是否不必执行以下操作:

const char *str = "mystring";
char array[30];
strcpy(array, str);
printf("%s\n", array);

我很困惑为什么你可以直接将字符串作为第二个参数传递给strcpy(),而不是指向字符串的指针。任何见解都将不胜感激。

【问题讨论】:

  • 在这种情况下,C 中的字符串简化为指向第一个元素/字符的指针。
  • C 没有字符串类型。

标签: c strcpy


【解决方案1】:

因为在 C 中字符串文字的类型是 char[] : http://c0x.coding-guidelines.com/6.4.5.html

[...对于字符串字面量,数组元素的类型为 char...]

【讨论】:

  • 在 strcpy 中使用之前,您是否必须将字符串文字分配给变量(例如 char *x = "string")?还是直接传递字符串就可以了,因为它会被简化为指针?
  • @ceno980 数组何时衰减为指针无关紧要。
  • @ceno980 如果一个字面量已经有你需要的匹配类型,复制到一个变量没有任何好处。
【解决方案2】:

这是由于 C 中数组和指针之间的特殊关系。

形式上,C 中的字符串是char 的数组。但是 C 中的指针可以非常轻松地用于访问数组,因此“指向char 的指针”通常与“char 的数组”一样有用。此外,每当您在需要其值的表达式中使用数组(包括字符串常量)时,您(自动)得到的是指向数组第一个元素的指针。

也就是说,如果你说

char array[10];
char *p = array;

就像你说的那样

char *p = &array[0];

而且由于字符串常量(正式地,字符串文字)是char 的数组,如果你说

p = "mystring";

strcpy(array, "mystring");

就像你说的一样

p = &"mystring"[0];

strcpy(array, &"mystring"[0]);

所以在这些情况下你不需要添加你自己的&,如果你这样做了,那就不太对了,因为你最终得到的是“指向数组的指针”而不是“指向char的指针” ' 这就是你想要的。

&"mystring"[0] 的语法非常奇怪,没有人会使用它,它可能使这个解释变得非常混乱。让我们以稍微不同的方式来做。如果你说

char mystring[] = "mystring";
p = mystring;

strcpy(array, mystring);

就像你说的一样

p = &mystring[0];

strcpy(array, &mystring[0]);

当您调用strcpy(array, &mystring[0]) 时,您将根据需要将char * 传递给strcpy。如果你打电话

strcpy(array, &mystring);   /* WRONG */

您将传递一个“指向char 数组的指针”(或char *[]),这是错误的。 (它甚至可能最终看起来有效,这可能会让您误以为它是正确的,但事实并非如此。)

【讨论】:

    【解决方案3】:

    我很困惑为什么可以直接将字符串作为第二个参数传递给 strcpy() 而不是指向字符串的指针。任何见解都将不胜感激。

    你必须为两个参数传递一个指向 c 字符串的指针,或者至少传递一个可以衰减到这样一个指针的东西。 char 类型数组char[](这是字符串文字的类型)可以做到这一点。

    请记住,c-string 不是类型。它是由第一个\0 终止的连续字节序列。

    这是一个启发性的例子:

    char c[30] = "Hello\0 \0World!\n";
    printf("%s%s%s\n", &c[0],&c[6],&c[8] );
    

    char 数组c 的大小为 30。它包含三个 c 字符串:“Hello”、“”和“World!\n”。它们的长度分别为 5、1 和 7,它们在数组中占用的空间量分别为 6、2 和 8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 2021-11-11
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多