【问题标题】:Write C++ string into char* [duplicate]将C ++字符串写入char * [重复]
【发布时间】:2012-01-16 22:20:26
【问题描述】:

可能重复:
Convert std::string to const char* or char*

void setVersion(char* buf, std::string version) {
  buf = version;
}

我正在尝试将版本字符串写入 buf,但上面的代码给了我这个错误“无法将 'std::string {aka std::basic_string}' 转换为 'char*' in assignment”。

最简单的修复方法是什么?

【问题讨论】:

    标签: c++ string


    【解决方案1】:

    确保 buf 有足够的空间来存储字符串

    strcpy(buf,version.c_str())
    

    【讨论】:

      【解决方案2】:

      如果您想要的只是 std::string 的 char* - 如前所述,请使用 vesrion.c_str()。

      如果您确实想将其复制到单独的缓冲区中 - 对于您使用的函数签名 - 应在调用函数之前分配缓冲区,并且应该与 version.size() + 1 的大小相同。

      否则您可以执行以下操作:

      void setVersion ( char** out, std::string in ) {
          *out = new char[in.size() + 1];
          strcpy ( out, in.c_str() );
      }
      

      HTH

      【讨论】:

        【解决方案3】:

        首先,界面存在严重问题,因为您没有 知道buf 有多大。不知道这一点,你就没有办法 正确地写任何东西。如果你通过了长度,你可以做 类似:

        void
        setVersion( char* buffer, size_t size, std::string const& version )
        {
            size_t n = version.copy( buffer, size - 1 );  // leave room for final '\0'
            buffer[ n ] = '\0';
        }
        

        另一种可能性是您的意图是设置一些全局 指针;给定的界面不能这样做,因为你有一个副本 指针,但如果你得到了它的引用,你可能会这样做:

        void
        setVersion( char*& buffer, std::string const& version )
        {
            if ( buffer != NULL ) {
                delete [] buffer;
            }
            buffer = new char[ version.size() + 1 ];
            size_t n = version.copy( buffer, std::string::npos );
            buffer[ n ] = '\0';
        }
        

        (其他版本也是可以的,但是你必须复制字符串,以避免 终生问题。)

        【讨论】:

          【解决方案4】:

          假设buf 的大小至少为version.length() + 1 字节:

          strcpy(buf, version.c_str());
          

          【讨论】:

          • -1 你不能在正确的代码中做出这样的假设。
          • @JamesKanze,我暗示这是 OP 的责任。
          • @JamesKanze:是的,你可以。由于调用者是同时传入指针和字符串的人,因此确保字符串的长度不超过缓冲区的大小当然是他的责任。
          • @BenjaminLindley 在这种情况下,拥有函数没有意义,因为调用者必须做的工作比函数中所做的要多。
          【解决方案5】:

          尝试在版本之后添加对c_str()的调用:

          void setVersion(char* buf, std::string version) 
          {
            buf = version.c_str();
          }
          

          【讨论】:

          • 您的代码没有可观察到的行为。
          • @BenjaminLindley 你这是什么意思?
          • @BenjaminLindley 你是什么意思?
          • @Hunter:使用 strcpy,您正在复制到指针指向的字符串。 buf 是在调用站点传入的任何指针的本地副本。即使它本身是本地的,它指向的东西仍然是它被复制的指针所指向的东西。如果您的假设是正确的,则无需将 char* 设为参数。它应该只在函数内部声明。
          • 另外,它需要声明为const char *
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-04
          • 2012-10-03
          相关资源
          最近更新 更多