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