【问题标题】:C++: Using Strcpy with Pointer Strings [duplicate]C ++:将Strcpy与指针字符串一起使用[重复]
【发布时间】:2023-03-31 16:22:01
【问题描述】:

可能重复:
Access violation when using strcpy?

我遇到了一些困扰我的事情

char* p = "Hello"; strcpy (p,"bye");

这总是给我一个错误,那么我怎样才能将 strcpy 与指针字符串一起使用。

(请不要告诉我使用 std::string)

谢谢

【问题讨论】:

    标签: c++ arrays string pointers strcpy


    【解决方案1】:
    char* p = "Hello";   //BAD - OBSOLETE!
    strcpy (p,"bye");
    

    一个好的编译器应该在第一行给出警告(或错误),因为那已经过时了,语言要求你写成:

    char const * p = "Hello";  //GOOD
    

    一旦你写了这个(无论如何这是正确的写法),那么一切都会变得清晰:p 指向 const 数据,表示p 指向的数据 不能修改,这反过来意味着,您不能使用strcpy(或手动)覆盖它。

    如果你想覆盖它,一种将p 声明为数组的方法:

    char p[] = "Hello";  //OK
    strcpy (p,"bye");    //OK - for any string (2nd arg) of length <= 5
    

    在 C++ 中,您应该使用std::string,尽可能避免使用char*char[]。所以用 C++ 编写代码的方式是这样的:

    #include <string>   //must include this first
    
    std::string p = "Hello";
    p = "bye"; //overwrite it. 
    

    这么简单!

    【讨论】:

    • 所以我不应该使用带指针的 strcpy 吗?
    • @MohamedAhmedNabil:问题不在于strcpy。您不能使用 const char * 或字符串文字作为目标。
    • 此外,如果新字符串大于创建 char-array 的字符串,即使使用 p[] 的解决方案也会导致问题。而且,如果您打算使用 C++,请以正确的方式使用它并使用 std::string,它根本不会受到伤害。 :)
    【解决方案2】:

    首先,你应该为你的字符串分配内存,像这样:

    char *p = new char[BUFFER_LENGTH];
    

    然后你可以将内容复制进去:

    strcpy(p, "bye");
    

    请参阅this page 了解其使用方法。

    完成后不要忘记删除内存:

    delete[] p;
    

    如果我对您的问题的理解有误,您也可以提供更多信息

    【讨论】:

    • 例如对于 BUFFER_LENGTH
      const int BUFFER_LENGTH = 100;
    • 不会和让它像 `char a[10]="Hello";
    • 一个是动态分配的,另一个在栈上,是的。这是不一样的。不过,使用指针时,您通常需要动态分配。
    猜你喜欢
    • 2017-04-09
    • 2018-05-08
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2020-03-27
    • 2011-03-13
    • 2019-03-20
    相关资源
    最近更新 更多