2

我正在尝试连接一些字符串,但它可以在一个字符串中起作用,但不能在另一个字符串中起作用。

工作:我接受2个论点,然后这样做。a = 你好,b = 世界

string concat = a + b;

输出将是 hello world 没有问题。

不工作:我从文件中读取并与第二个参数连接。假设文件中的字符串是 abcdefg。

string concat = (string from file) + b;

它给了我worldfg

来自 b 的字符串不是连接,而是覆盖初始字符串。

我尝试了其他一些方法,例如使用 stringstream,但效果不佳。

这是我的代码。

int main (int nArgs, char *zArgs[]) {
    string a = string (zArgs [1]);
string b = string (zArgs [2]);
    string code;

    cout << "Enter code: ";
cin >> code;

    string concat = code + b;
}
// The output above gives me the correct concatenation.
// If I run in command prompt, and do this. ./main hello world
// then enters **good** after the prompt for code.
// The output would be **goodworld**

但是,我从文件中读取了一些行。

 string f3 = "temp.txt";
 string r;
 string temp;

 infile.open (f3.c_str ());

 while (getline (infile, r)) {
    // b is take from above
temp = r + b;
    cout << temp << endl;
 }
 // The above would give me the wrong concatenation.
 // Say the first line in temp.txt is **quickly**.
 // The output after reading the line and concatenating is **worldly**

希望它给出更清楚的例子。

更新:

我想我可能已经发现问题出在文本文件上。我试图创建一个新的文本文件,里面有一些随机的行,它看起来工作正常。但是如果我尝试读取原始文件,它会给我错误的输出。仍然试图解决这个问题。

然后我尝试将原始文件的内容复制到新文件中,它似乎工作正常。不过不太确定这里出了什么问题。将继续测试,希望它工作正常。

感谢所有的帮助!欣赏它!

4

2 回答 2

3

我得到与提出原始问题的小伙子相同的输出:

$ ./a.out hello world
Enter code: good
goodworld
worldly

这里的问题是文本文件的内容。在我的示例中,文本文件中的前 7 个字符是:“quickly”。但是,紧随其后的是 7 个退格字节(十六进制 08)。这是 emacs 中的内容:

quickly^H^H^H^H^H^H^H

那么这是如何造成混乱的呢?

那么串联操作实际上可以正常工作。如果你这样做:

std::cout << "string length: " << temp.size() << "\n";

...您会得到由以下组成的答案19:“快速”(7)+ 7 个退格字符+“世界”(5)。您观察到的覆盖效果是在您将这 19 个字符字符串打印到控制台时引起的:控制台(例如 xterm)将退格序列解释为“将光标移回左侧”,从而删除了较早的字符。相反,如果您将输出通过管道传输到文件,您将看到实际生成了完整的字符串(包括退格)。

要解决此问题,您可能需要验证/更正来自文件的输入。在 C/C++ 环境中isprint(int c), iscntrl(int c),您可以使用一些常用的功能。

更新:正如另一个响应者所提到的,其他 ASCII 控制字符也将具有相同的效果,例如,回车(十六进制 0D)也会将光标移回左侧。

于 2012-10-27T09:11:44.673 回答
1

如果我编译这个

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main (int nArgs, char *zArgs[]) {
   string a = string (zArgs [1]);
   string b = string (zArgs [2]);
   string code;

   cout << "Enter code: ";
   cin >> code;

   string concat = code + b;
   // The output above gives me the correct concatenation.

   //However, I read some lines from the file.
   ifstream infile;

   string f3 = "temp.txt";
   string r;
   string temp;

   infile.open (f3.c_str ());

   while (getline (infile, r)) {
      temp = r + code;
      cout << temp << endl;
   }
   // The above would give me the wrong concatenation.
   infile.close();
   return 0;
}

它可以完美地编译和运行。这在你的电脑上有什么作用?如果失败,我们可能需要比较temp.txt.

(这应该是评论而不是答案,但它太长了。对不起。)

于 2012-10-27T07:17:15.420 回答