无法理解如何在 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 << i;
这里的主要问题是您使用的是 printf() 而不是 std::cout
。你传递的字符串很好。
一路下来,所有的好答案!比我过去两天读过的其他 100 本书更清晰、更中肯。谢谢。
另外,而不是for (string i : added_messages)
,让它成为for (string& i : added_messages)
- 这样可以避免在枚举期间复制字符串。
if (added_messages.size() != 0)
检查也是不必要的。
【参考方案1】:
养成将字符串参数声明为 const 引用的习惯。
而不是这个:
void addMessage(string s)
...
这个:
void addMessage(const string& s)
...
这不仅可以避免复制字符串,还可以让您传递string
实例以及指向字符串的string literals
和char*
变量。也就是说,以上实现了以下所有功能:
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());
不用说cout
比printf
更受欢迎:
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++ 中传递字符串的主要内容,如果未能解决你的问题,请参考以下文章