无法理解如何在 C++ 中传递字符串

Posted

技术标签:

【中文标题】无法理解如何在 C++ 中传递字符串【英文标题】:Trouble Understanding How to Pass a String in C++ 【发布时间】:2020-03-29 23:25:32 【问题描述】:

是否有人可能分解将字符串传递给函数的正确方法,该函数是否将其放入向量中,而另一个函数打印向量的内容?我确信有很多重复项,我(大部分)都看过它们,但仍然无法将其中任何一个应用于这个问题,或者至少在我看来是这样。

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

using namespace std;

static vector<string> added_messages;
static void addMessage(string message);
static void displayMessages();

int main()

    string message = "Testing 1 2 3";
    addMessage(message);
    //printf("%s\n", message);
    return 0;


void addMessage(string s)

    added_messages.push_back(s);
    //printf("%s\n", s);


void displayMessages()

    if (added_messages.size() != 0) 
        for (string i : added_messages)
            printf("%s\n", i);
    
    added_messages.clear();

它主要打印出垃圾:4÷/4⌠/

我是 C++ 的新手,并且来自 Java,我只是想不通。谢谢。

【问题讨论】:

%s 的格式适用于char *,而不适用于string。使用i.c_str() 将其作为char* 获取 - 或使用其他方法打印它,例如cout &lt;&lt; i; 这里的主要问题是您使用的是 printf() 而不是 std::cout。你传递的字符串很好。 一路下来,所有的好答案!比我过去两天读过的其他 100 本书更清晰、更中肯。谢谢。 另外,而不是for (string i : added_messages),让它成为for (string&amp; i : added_messages) - 这样可以避免在枚举期间复制字符串。 if (added_messages.size() != 0) 检查也是不必要的。 【参考方案1】:

养成将字符串参数声明为 const 引用的习惯。

而不是这个:

void addMessage(string s)

    ...

这个:

void addMessage(const string& s)

    ...

这不仅可以避免复制字符串,还可以让您传递string 实例以及指向字符串的string literalschar* 变量。也就是说,以上实现了以下所有功能:

addMessage("Foobar");

const char* psz = <some other string>
addMessage(psz);

std::string s = "A string";
addMessage(s);

然后用printf正确打印字符串,使用.c_str()成员函数获取内容的指针地址。

而不是这个:

printf("%s\n", s);

这个:

printf("%s\n", s.c_str());

不用说coutprintf 更受欢迎:

cout << s << endl;

总而言之:

static vector<string> added_messages;
static void addMessage(const string& message);
static void displayMessages();

int main()

    string message = "Testing 1 2 3";
    const char* psz = "Yet, another messsage);

    addMessage(message);
    addMessage("Another Message as a string literal);
    addMessage(psz);

    // sample printf statements
    printf("%s\n", message.c_str());
    printf("%s\n", psz);

    // sample cout statements - notice it can handle both pointers and string instances
    cout << message << endl;
    cout << psz << endl;
    cout << "Hello World" << endl;

    return 0;


void addMessage(const string& s)

    added_messages.push_back(s);
    printf("%s\n", s.c_str());


void displayMessages()

    for (const string& i : added_messages)
    
        printf("%s\n", i.c_str());
    

    added_messages.clear();

【讨论】:

【参考方案2】:

你不能在 string() 对象上使用 printf("%s") - 这就是你在输出中有垃圾的原因。 "%s" 需要 C 字符串,即指向以零字节结尾的 char 的指针。 如果您需要打印 string() 对象,请使用 c_str() 方法获取 C 字符串表示,即在您的情况下为 i.c_str()。 C++ 将 C 概念与 C++ 概念混合在一起,因此请注意。使用 iostream 标头和 std::cout

关于参数传递。在您的示例中,您做得很好,但请记住,在您的情况下,您是按值执行的,即创建了对象的副本。更有效的是通过引用传递。

【讨论】:

@TedLyngmo 你显然是对的。我修正了我的评论。【参考方案3】:

这应该可行:

for(std::size_t i = 0; i < added_messages.size(); i++)
    printf("%s\n",added_messages[i].c_str());

【讨论】:

以上是关于无法理解如何在 C++ 中传递字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串从 Python3 传递给 cythonized C++ 函数

如何在 C++ 和 C# 之间传递字符串参数?

如何在 C++ 中通过指针传递字符串?

C++:试图理解通过引用传递向量

Qt C++ - 如何成功地将数据传递给子进程?

C++函数如何传递字符串