为什么printf输出的是字符而不是数据?

Why does printf output characters instead of data?

为什么printf输出的是字符而不是数据? 看代码可以比较明白我要做什么,但是不清楚为什么输出是这样

#include <vector>
#include <string>
#include <cstdio>

class Person
{
public:
    Person(const std::string& name, uint16_t old)
        : m_Name(name)
        , m_Old(old) 
    {
    }

public:
    std::string GetName() const { return m_Name; }
    uint16_t GetOld() const { return m_Old; }

private:
    std::string m_Name;
    uint16_t m_Old;
};

int main()
{
    std::vector<Person> person = { Person("Kyle", 26), Person("Max", 20), Person("Josiah", 31) };
    for (uint16_t i = 0; i < person.size(); ++i)
    {
        printf("Name: %s Old: %u\n", person[i].GetName(), person[i].GetOld());
    }
    return 0;
}


> // output
>     Name: Ь·╣ Old: 1701607755 
>     Name: Ь·╣ Old: 7889229 
>     Name: Ь·╣ Old: 1769172810

std::printf 是 C 标准库中的一个函数。它不知道 std::string class。您需要向 %s 提供一个 C 字符串 (const char*)。您可以通过调用 std::string::c_str() 方法来做到这一点。

printf("Name: %s Old: %u\n", person[i].GetName().c_str(), person[i].GetOld());

printf()"%s" 一起使用需要 (const) char*(或衰减为 (const) char* 的东西,例如 (const) char[])。

std::string has a c_str() 方法,其中 returns 您可以传递给 printf()char const*

因此,您的 printf() 行应该是:

printf("Name: %s Old: %hu\n", person[i].GetName().c_str(), person[i].GetOld());

注意:我还将 %u 更改为 %hu - 请参阅

或者,您可以使用 C++ 的 std::cout 流打印 std::string as-is:

#include <iostream>

std::cout << "Name: " << person[i].GetName() << " Old: " << person[i].GetOld() << std::endl;