【问题标题】:How does strcpy() copy a string to an array when you can't change the address of an array?无法更改数组地址时,strcpy() 如何将字符串复制到数组中?
【发布时间】:2012-10-02 17:12:58
【问题描述】:

所以基本上 strcpy 将第二个参数的地址分配给第一个参数,但是它如何将数组作为第一个参数呢?就像在我的程序中一样,我尝试更改数组的地址,但不幸的是它不会编译。所以我不得不求助于制作一个字符指针变量来分配大写的返回值。我有什么误解吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char string[20];
char *Capitalize(char *str)
{
    int i;
    char *temp;
    temp = malloc(sizeof(char)*(int)(strlen(str)+1));
    for(i = 0;i < strlen(str);i++)
    {
        if(*(str+i) >= 'a' && *(str+i)<= 'z')
            *(temp+i) = *(str+i) - 32;
        else
            *(temp+i) = *(str+i);
    }
    *(temp+i) = '\0';
    return temp;
}
int main(void)
{
    string word;
    printf("Enter word to capitalize: ");
    scanf("%19s",word);
    word = Capitalize(word);
    printf("%s",word);
    return 0;
}

【问题讨论】:

  • "strcpy 将第二个参数的地址分配给第一个"不,它没有,它复制内容。
  • 当您的示例代码都没有使用 strcpy() 时,为什么还要询问它?
  • @Glenn word = Capitalize(word) 这给出了一个错误,所以我想知道 strcpy() 如何将第二个参数的地址分配给数组,而显然它不能。我正在练习弦乐,所以我突然想到了这个想法。
  • 附带说明,sizeof(char) 被定义为 1 并且强制转换没有用,因此您可以将 malloc(sizeof(char)*(int)(strlen(str)+1)); 更改为 malloc(strlen(str) + 1);
  • 您将char * 分配给char [20],这就是问题所在

标签: c arrays string pointers strcpy


【解决方案1】:

strcpy() 进行复制,正如其名称所暗示的那样。将字符串复制到数组中是完全合法的。

当您对数组进行初始化时,例如:

char myarr[] = "hello";

您实际上是将字符复制到数组中。

您似乎将数组与指针混淆了 (see here for some reason you can't treat them the same)

【讨论】:

    【解决方案2】:

    在 C 中,通过名称限定数组而不使用索引器,相当于指定指向数组中第一个元素的内存地址的指针,这就是为什么您可以将数组作为参数传递给像 strcpy 这样的函数.

    char * strcpy ( char * destination, const char * source );
    

    strcpy 将从source 指定的内存地址开始复制找到的任何一系列字符到destination 指定的内存地址,直到找到一个空字符(0)(这个空字符也是复制到目标缓冲区)。

    参数中指定的地址值不会被修改,它们只是指定从内存中的哪里复制到哪里。 destination 指向的内存缓冲区(可以是 char 数组或通过 malloc 请求的内存块)具有足够的容量以容纳复制的字符串,这一点很重要,否则将发生缓冲区欠载(您将写入字符过去缓冲区的末尾)并且您的程序可能会崩溃或以奇怪的方式运行。

    希望我的解释很清楚,不要让你更加困惑;)

    【讨论】:

      【解决方案3】:

      您似乎缺少的是在 c/c++ 字符串中是数组,在大多数实际方面声明

      char c[] = "hello";
      

      char* c = "hello";
      

      是一样的,strcpy 所做的只是将字符复制到目标内存中,无论该内存是作为数组分配(大概在堆栈上)还是指针(大概在堆上);它没有区别。

      【讨论】:

      • 不,这两个声明非常不同。第一个声明了一个名为cchar[6],您可以修改它,但不能分配给它,c = whatever; 不会编译。第二个声明一个指针并将其初始化为指向一个 unmodifiable (嗯,它可能是可修改的,但尝试这样做会调用未定义的行为)char[6],然后您可以为如果您愿意,请稍后指针。
      • 不,它们不一样。第一个,c 是一个数组,第二个c 是一个指向只读内存的指针。此外,在 C++ 中,字符串不是数组(或者至少它们不应该是)。
      • “在最实际的方面”另外我不确定你从哪里得到它是一个指向只读内存的指针,这是实现定义的。
      猜你喜欢
      • 1970-01-01
      • 2013-02-26
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2016-01-05
      • 2011-07-04
      • 2020-10-18
      相关资源
      最近更新 更多