【问题标题】:How in to stringstream put a string如何在字符串流中放置一个字符串
【发布时间】:2023-03-16 13:29:01
【问题描述】:

我有一个向量:

vector<stringstream*> ssv;
for (int i = 0; i < cIter; i++) {
    ssv.push_back(new std::stringstream);
}

如何放入向量 ssv 字符串的元素?

我试试:

string s1 = "easfef" + '\n';
int i = 0;
*ssv[i] << s1 << '\n';

但它给了我一个空字符串:

string sdf = ssv[i]->str();

我该怎么做?

感谢您对 '\n' 的帮助,但它仍然是矢量的问题: 如果我写:

std::string s1 = "qwerqwr\n";   // for example
int i = 0;
*ssv[i] << s1;

但是像以前一样给我一个空字符串

string sdf = ssv[i]->str();

【问题讨论】:

  • "easfef" + '\n' 不好。
  • 为什么要将stringstream存储在vector中?
  • 为什么要为stringstream 使用指针?
  • 我想在接下来的步骤中从字符串中提取字符串进行排序。矢量的每个元素将包含几个字符串(文本格式)
  • @JoachimPileborg,嗯,它们是不可复制的,所以除非移动是一种选择,否则你不能。不过,这还处于低水平。它可以通过更高级别的问题来解决。

标签: c++ string stl stringstream


【解决方案1】:

您的主要问题是如何初始化字符串:

"easfef" + '\n'

"easfef" 衰减为 const char *'\n' 提升为值为 10 的 int(假设为 ASCII)。然后,将两者相加,从而产生一个指针,该指针指向字符串文字之外的某个位置。很有可能发生车祸,而且你的母亲被恐龙吃掉了。

解决此问题的一种简单方法是强制执行std::string

std::string s1 = std::string("easfef") + '\n';

更简单的方法是内联换行符:

std::string s1 = "easfef\n";

【讨论】:

  • +1 - A crash is very possible, along with your mother being eaten by a dinosaur. - 只是,哈哈:D
  • @webnoob,我不后悔。
  • 好,你已经尽你所能从那只可怕的恐龙手中救出他的母亲..
【解决方案2】:

在你的代码中

string s1 = "easfef" + '\n';

初始化表达式将在实践中计算为

"easfef" + 10;

这是指向字符串第十一个字符的指针。

但是没有这样的,所以你有未定义的行为


修复:

string s1 = string() + "easfef" + '\n';

也就是说,指向stringstream 的指针向量对于您要解决的任何问题几乎肯定是不切实际的解决方案。

尝试描述更高层次的问题。

【讨论】:

  • 为什么选择构造一个空的临时字符串并将其添加到“easfef”中,生成另一个临时字符串,而不是构造一个以 easfef 作为构造函数参数的临时字符串?为什么不建议将 '\n' 常量放入字符串文字中?
  • @Agentlien,他可能没有想到。直到我输入我的第一个建议时,我才意识到它是一个字符串加一个字符。
  • 好吧,我尝试解决 en.wikipedia.org/wiki/External_sorting 中的项目 4-5,其中我的元素 - 来自 .txt 文件的字符串
  • @chris 或许,这个简单的答案并没有让 我的 想到。 <.>
  • @Agentlien: re the string() + ,因为可维护性比我写的更好。您的建议是对无关细节的过早优化。过早地优化一个表达式,首先不计入总体执行时间,其次编译器很可能会自动为您执行,因此会导致程序员花费大量时间来过早地优化表达式,这将是非常不利的。每当你有过早优化的冲动时,请记住,不要这样做。下一次(几分钟后),不要这样做。那如果还催,先MEASURE
【解决方案3】:

在 C++ 中,字符串文字是 chars 的原始数组,数组可以被视为指针,而像 '\n' 这样的字符文字可以被视为数字,因此 "easfef" + '\n' 被解释为指针算术运算。

你应该写:

string s1 = "easfef";
s1 += '\n';

【讨论】:

    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多