【问题标题】:C++ string concatenationC++ 字符串连接
【发布时间】:2015-11-01 02:22:32
【问题描述】:

我在 Thinking In C++, 2nd Edition, Volume 1 ©2000 by Bruce Eckel 一书中第 2 章中的练习 6。

原来的问题:

更改 Fillvector.cpp,使其在打印输出之前将向量中的所有元素连接成一个字符串,但不要尝试添加行号。

文件 Fillvector.cpp 位于http://www.BruceEckel.com

以下代码是我为解决练习而编写的:

// Fillvector.cpp
#include <string>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<string> v;
    ifstream in("Fillvector.cpp");
    string line, ss;

    while (getline(in, line)) {
        v.push_back(line);
    }

    for (vector<string>::size_type i = 0; i < v.size(); i++) {
        ss += v[i];
    }

    cout << ss;

    return 0;
}

代码编译成功,我得到了生成的结果:

} 返回 0;s;[i];ing>::size_type i = 0; i

输出不是我想的那样。我认为输出必须如下:

// Fillvector.cpp#include <string>#include <fstream>#include <iostream>#include <vector>using namespace std:int main() {vector<string> v;ifstream in("Fillvector.cpp");string line, ss;while(getline(in, line))v.push_back(line);for(string::size_type i = 0; i < v.size(); i++)ss += v[i];cout << ss;return 0;}

我在http://www.cplusplus.com/reference/string/string/operator+=/ 阅读了有关字符串连接运算符的信息,但仍然不知道为什么输出错误。请为我解释这个输出。任何帮助将不胜感激。

【问题讨论】:

  • Fillvector.cpp 包含什么?
  • Fillvector.cpp 包含上面的源代码。

标签: c++ string


【解决方案1】:

你在 windows 上运行,你的输出是:-

// Fillvector.cpp\r#include <string>\r#include <fstream>\r#include <iostream>

这看起来比实际上更错误,因为 \r 将光标移动到行首。

【讨论】:

  • 这完全是正确的答案。 OP 的输出是正确的,但答案都被套印了。 Windows 的又一次胜利!
  • 不,在 Windows 上,getline() 实际上足够聪明,可以删除那些讨厌的回车。 ——也就是说,这似乎是正在发生的事情……
  • 我在 Linux 上运行。该文件是使用 geany 编写的。现在我明白打印的是什么了。非常感谢,mksteve。
  • @Dúthomhas:Linux 上的 getline() 不够聪明。
  • "你正在 Windows 上运行..." 我知道 getline() 在 Windows 和 Linux 上的行为之间的区别。 mksteve 的评估是正确的,因为 OP 在 Linux 上有一个 Windows 编码文件——这是操作员错误,而不是 getline()/C++ 错误。
【解决方案2】:

你做对了,但是你打开了文件“FillVector.cpp”。要获得所需的输出,您必须打开源代码文件。因此,如果您将程序代码命名为“a.cpp”,那么您应该打开“a.cpp”以将您的源代码连接成一行。

此外,在第 14 行,您使用 string::size_type 来迭代向量。应该是vector&lt;string&gt;::size_type。也就是说,一个简单的size_t 也可以。

另外,不要忘记缩进。 (第 13 和 15 行。)

希望这会有所帮助。

【讨论】:

  • 谢谢! FillVector.cpp 是源代码文件本身。我忘了评论它。我按照您的建议更改了它,但它确实编译错误。我必须插入 vector::size_type 才能成功编译。问题依然存在。我得到的输出是: } return 0;s;[i];ing>::size_type i = 0; i
  • 我实际上在我的编辑器中缩进了这些行。但是,当我在问题字段上粘贴所有行时,我使用 4 个空格手动格式化它们,正如 Stack Overflow Asking Question Guide 所说,忘记缩进第 13 行和第 15 行。感谢您指出。
【解决方案3】:

您的代码对我来说工作正常(一旦我将 : 更改为 ;,正如我在编辑中指出的那样。我得到了您想要的结果:

$ g++ FillVector.cpp
$ ./a.out
#include <string>#include <fstream>#include <iostream>#include <vector>using namespace std;int main() {    vector<string> v;    ifstream in("Fillvector.cpp");    string line, ss;    while(getline(in, line)) {        v.push_back(line);    }    for(string::size_type i = 0; i < v.size(); i++)  {        ss += v[i];    }    cout << ss;    return 0;}$ 

这是缩进更好的代码:

#include <string>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<string> v;
    ifstream in("Fillvector.cpp");
    string line, ss;

    while(getline(in, line)) {
        v.push_back(line);
    }
    for(string::size_type i = 0; i < v.size(); i++)  {
        ss += v[i];
    }

    cout << ss;

    return 0;
}

但是,如果您希望代码在 Windows 上产生合理的输出,则需要在每个字符串之间强制换行。试试这个:

#include <string>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<string> v;
    ifstream in("Fillvector.cpp");
    string line, ss;

    while(getline(in, line)) {
        v.push_back(line);
    }
    for(string::size_type i = 0; i < v.size(); i++)  {
        ss += v[i] + std::string("\n");  // Add a \n for windows!
    }

    cout << ss;

    return 0;
}

【讨论】:

  • 冒号是我打错了,很抱歉。但我仍然得到错误的输出: } return 0;s;[i];e_type i = 0; i
  • 输出是在 Linux 上生成的。感谢您的帮助,vy32,非常感谢。
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多