【问题标题】:Problem with converting std::string to char*将 std::string 转换为 char* 的问题
【发布时间】:2020-05-04 06:13:45
【问题描述】:

我正在尝试使用连接到串行通讯的设备。一个用来打开通讯端口的API是这样的

int OpenComport(char * comport, int baudrate);

所以最初,我在我的配置文件中的某处定义了 comport

//// my config file
#define COMPORT "/dev/ttyUSB0"

//// inmy settings file 
settings->serveraddr_spad = COMPORT;

认为我已经正确设置了所有内容,我开始将字符串转换为 const char,然后转换为向量(见下文)。

//// in my usage file
std::vector<char> portchar((settings->serveraddr_spad).c_str(), 
                           (settings->serveraddr_spad).c_str() +
                        (settings->serveraddr_spad).size() + 1);

if(OpenComport(  &portchar[0], settings->serverbaud_spad))
{
   // do my action
}

所有这些似乎都与编译器一致,并且运行顺利。但是在执行时,我发现端口没有打开。

当我切换到这种在前面声明 char 数组的用法时,它可以工作(下)

char portchar[13] = "/dev/ttyUSB0";

if(OpenComport( portchar, settings->serverbaud_spad))
{
   // do my action
}

我的问题是如何将 std::string 转换为 char* 以供使用?

问候

【问题讨论】:

  • std::string::c_str() 怎么样?顺便提一句。 &amp;portchar[0] 也应该适用于 std::string portchar;。从 C++11 开始,为 std::string 授予内容的 0 终止符。希望OpenComport() 不会更改缓冲区的内容。否则,std::string 应事先强制为足够大小。 (实际上,它与std::vector&lt;char&gt; 没有什么不同,只是std::string 提供了更多便利,例如自动归零终止。)
  • c_str() 似乎不太好,因为它返回const char*,而在这种情况下请求char*std::string 的元素是连续存储的,所以 &amp;settings-&gt;serveraddr_spad[0] 应该可以工作。
  • 同样在更高版本的 C++ 标准中,std::string 保证为空终止。我忘了到底是哪个版本引入了这个保证人。
  • @MikeCAT 同意。我的第一印象是 char* 参数缺少的 const 只是旧 API 的遗留物。不过,现代编译器可能会抱怨没有足够的 const-cast,而 &amp;portchar[0] 变体则不会。
  • @john 根据 cppreference 自 C++11 起。 可以将指向 s[0] 的指针传递给函数,这些函数需要指向以 null 结尾的(C++11 起)CharT[] 数组的第一个元素的指针。

标签: c++ string char


【解决方案1】:

您几乎永远不需要vector&lt;char&gt;,而只需使用:

if(OpenComport( (char*) settings->serveraddr_spad.c_str(), settings->serverbaud_spad))

【讨论】:

  • 这段代码会导致编译错误如error: invalid conversion from 'const char*' to 'char*'
  • @MikeCAT 添加了演员表,所以它会编译得很好
  • @lenik 你应该使用 const_cast 而不是 C 风格的演员:OpenComport( const_cast&lt;char*&gt;(settings-&gt;serveraddr_spad.c_str()), ...)
【解决方案2】:

您可以使用std::string::data()。与c_str() 相比,它为非常量字符串返回char *。从 C++11 开始,保证返回的数组将以空值结尾。

if(OpenComport(settings->serveraddr_spad.data(), settings->serverbaud_spad))
{
   // do my action
}

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2011-08-02
    • 2014-07-23
    • 2013-09-10
    相关资源
    最近更新 更多