C++:无法将字符串转换为 char*?

C++: Cannot convert string to char*?

我正在尝试使用以下代码在 C++ 中打印 Deque 的第一项(顶部项):

#include <queue>
#include <deque>
#include <string>

using namespace std;

int main(int argc, char *argv[]){
    deque<string> commandHistory;

    for (int i = 0; i < 2; i++) {
        commandHistory.push_back("asdf");
    }

    printf(commandHistory.at(1));
    return 0;
}

但是,我在 printf 语句中得到一个错误:

error: cannot convert ‘__gnu_cxx::__alloc_traitsstd::allocator<std::__cxx11::basic_string<char

, std::__cxx11::basic_string >::value_type’ {aka ‘std::__cxx11::basic_string’} to ‘const char*’

但是,我不能像这样将 commandHistory.at(1) 转换为 const char*

printf((const char*) commandHistory.at(1));

尽管您的问题同时标记为 C 和 C++,但我会删除 C 标记,因为您的代码更多的是 C++ 而不是 C。

printf 的文档在这里:https://en.cppreference.com/w/cpp/io/c/fprintf

该函数的要点是它至少需要 1 个参数:所谓的格式字符串,正如签名所说,是 const char*.

char *std::string是完全不同的类型。 std::string 是一个 class 而 char * 只是一个指向内置类型的指针。您的 std::deque 包含 std::string 个对象。

方便的是,std::string 提供了一个转换为 const char* 的函数,正好适用于这些情况。

因此,工作片段将是:

// looks like you were missing cstdio
#include <cstdio>
#include <deque>
#include <string>
using namespace std;

int main(int argc, char *argv[]){
    deque<string> commandHistory;

    for (int i = 0; i < 2; i++) {
        commandHistory.push_back("asdf");
    }
    // note the `c_str` method call to get a c-style string from a std::string
    printf(commandHistory.at(1).c_str());
    return 0;
}

就像编译器说的那样,你不能将std::string转换(用static_cast)到char*,但你可以用[=24获得所需的const char* =].

正如其他人提到的,您还可以包括 iostream 并使用 std::cout 其中 knows 对每种类型(const char*, std::string, int, ...) 也可以与您自己的类型一起使用。

编辑:cleaner/clearer code/explanations.