【问题标题】:Not getting expected result - string concatenation没有得到预期的结果 - 字符串连接
【发布时间】:2012-03-27 20:08:28
【问题描述】:

我已经编写(复制和修改)了一个代码,其目标是将所有行连接成一个文件中的单个字符串。但是我得到了意想不到的结果。

//Fillvector.cpp

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

int main() {
    vector<string> v;
    ifstream in("Fillvector.cpp");
    string line;
    string finalString="";
    while(getline(in, line))
    v.push_back(line);
    for(int i=0; i < (int)v.size(); i++) {
    finalString += v[i];
    }
    cout << finalString << endl;
}

我在终端上得到的结果是

}nt maincout << finalString << endl;(); i++) {

怎么了?

【问题讨论】:

  • 缩进你的代码将极大地帮助你了解事情的进展,更不用说让其他人看到它......
  • 这不会阻止您的代码编译,但如果您使用-Wall 运行,您将看到在 for 循环条件中比较 unsigned 和 sign int 的警告。您可以通过将i 声明为无符号整数或将v.size() 的结果转换为整数来解决此问题。此处以更好的格式对此进行了解释:cplusplus.syntaxerrors.info/…
  • 看起来除了我之外你们所有人都明白了。不知道怎么回事。
  • @AdamBernier 看起来这应该是我的系统有问题,因为所有其他人都能够正确处理。但我不知道这是什么问题以及如何纠正它。

标签: c++ g++ linux-mint


【解决方案1】:

问题是getline()includes the terminating newline character,您想将其删除或替换为空格。有关类似问题的答案,请参阅 Im getting a lineshift when trying to build a string

【讨论】:

  • 如果不适合我,它怎么会为其他人工作?这是“Thinking in C++”附带的代码之一。我想知道如果我不能,其他人会怎么做
【解决方案2】:

看起来您的endl 字符只是一个CR,没有后续LF。这意味着每个额外的 line out 输出都会覆盖前一行,因此您将看到每列中显示的最后一个字符。


仔细一看,问题出在一行

finalString += v[i];

应该是

finalString += v[i] + "\n";

否则,您将连接以CR(回车)字符结尾但没有LF(换行或换行)字符的字符串。

【讨论】:

  • 这应该怎么回答这个问题?
  • @eudoxos:对不起,我还没来得及回答就被叫走了。更好?
  • 这可以解释为什么你会得到你得到的输出。您的程序实际上打印了所有行,但不是在新行上打印每一行,而是您的程序转到行的开头(使用 CR - 或回车)并在旧输出的顶部打印新文本。例如,开头的} 来自最后一行。 nt 来自int 中的int main-line 等。
  • @Lindydancer 的解释似乎是正确的,但如何让它正常工作?
  • @Lindydancer 这是否意味着我需要用其他字符替换回车?
【解决方案3】:

嗯.. 为我工作(MinGW G++ 4.6.1,Windows):

C:\>fillvector
//Fillvector.cpp#include <string>#include <iostream>#include <fstream>#include <
vector>using namespace std;int main() {vector<string> v;ifstream in("Fillvector.
cpp");string line;string finalString;while(getline(in, line))v.push_back(line);f
or(int i=0; i < v.size(); i++) {finalString += v[i];}cout << finalString << endl
;}

C:\>

那么,您使用的是什么编译器和操作系统?

另外,请注意getline 删除了换行符,因此您可能需要稍微更改代码:

[...]
while(getline(in, line)) {
  v.push_back(line);
  v.push_back("\n");
}
[...]

更改后,您的代码将与cat fillvector.cpptype fillvector.cpp 非常相似。

【讨论】:

  • 我正在使用 g++ 编译器和 linux mint 11 操作系统。
【解决方案4】:

您的代码没有问题。

$ g++ Fillvector.cpp 
$ ./a.out 
//Fillvector.cpp#include <string>#include <iostream>#include <fstream>#include <vector>using namespace std;int main(){    vector < string > v;    ifstream in("Fillvector.cpp");    string line;    string finalString;    while (getline(in, line))        v.push_back(line);    for (int i = 0; i < v.size(); i++) {        finalString += v[i];    }    cout << finalString << endl;}
$ ./a.out  | wc -l
1

请参阅上面的日志。最后一行计算行数。及其1

【讨论】:

  • 即使对我来说它给了 1。但它没有正确打印字符串。有什么命令可以查看字数吗?
  • $ ./a.out | wc -w 获取字数。或者./a.out | wc -c 会给你字节数。链接:en.wikipedia.org/wiki/Wc_(Unix)。但是wc 的默认显示——至少在我的机器上——是显示 lineswordsbytes
猜你喜欢
  • 1970-01-01
  • 2018-08-31
  • 2022-01-24
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多