繁体   English   中英

将标准字符串转换为char *的方法不同

[英]Difference in methods for converting std string to char*

我知道有很多关于如何将std :: string转换为char *的问题,通过研究,我采用了几种不同的选择。 但是,似乎唯一适合我的方法是c_str()方法中的const_cast。

因此,我暂时使用该方法,但想了解有关其他方法为何不起作用的更多信息。 我为何无法按预期工作,这似乎对其他许多人都有用,但我的理解尚不足。

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    char* test = "Hello World";
    string testStr(test);

    vector<char> testVec2(testStr.begin(), testStr.end());
    // testVec2[0] = 'F';
    char* test2 = reinterpret_cast<char*>(testVec2.data());

    vector<char> testVec3(testStr.begin(), testStr.end());
    // testVec3[0] = 'G'; 
    char* test3 = &testVec3[0];

    // The only one that works
    char* test4 = const_cast<char*>(testStr.c_str());

    cout << "char* test: " << test << " [" << strlen(test) << "]" << endl;
    cout << "str test: " << testStr << " [" << testStr.length() << "]" <<     endl;
    cout << "=== conv testing === " << endl;
    cout << "char* test2: " << test2 << " [" << strlen(test2) << "]" <<     endl;
    cout << "char* test3: " << test3 << " [" << strlen(test3) << "]" << endl;
    cout << "char* test4: " << test4 << " [" << strlen(test4) << "]" << endl;

    cin.get();
    return 0;
}

我知道使用const_cast的隐患,但目前适用于我的情况。 我只是简单地从用户那里获取字符串,将其传递给C API,并且对其不做任何处理(不必担心被修改)。

这是输出示例https://imgur.com/a/2S1HD

那么我在做错什么,还有更好的方法吗?


更新感谢大家的快速答复。 似乎我的内在困惑是假设空终止符不在我分配给char *变量的新缓冲区中。 因此,为什么我的输出在字符串后显示随机字符(这应该是我的线索,但是自从完成C / C ++以来已经很久了)

我也应该最初对此C ++ 17进行标记(自修复以来),因为这是我的目标。 我没有在Visual Studio的控制台应用程序中启用该功能,该功能使Passer By的解决方案无法正常工作。 这就是我今后将使用的方法。

底线,将我的目标更改为C ++ 17,这可以按预期工作

char* test = "Hello World";
string testStr(test);
vector<char> testVec2(testStr.begin(), testStr.end());  
char* test2 = testStr.data();
vector<char> testVec2(testStr.begin(), testStr.end());

这将创建以下向量:

vector<char> testVec2 = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};

有什么从你身上跳下来吗? 这应该。 它不包含空终止符。 因此,任何尝试将testVec2.data()用作C字符串都将导致未定义行为。

尽管从C++11 std::string的基础缓冲区必须包含空终止符,但begin - end范围不包含该字符。

在C ++ 17中,从std::string获取char*的最简单方法是

std::string str = "Why is this only available since C++17?";
some_c_function(str.data());

至于为什么其他方法不起作用,请参考bolov的答案

c++11 ,从std::string获取非常量 char*的最佳方法是使用以下代码:

std::string s = "hello";

my_non_const_correct_c_function(&s[0]); // better than using const_cast

如果在未声明conststd::string上使用const_cast ,则可能会遇到未定义的行为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM