C ++中的字符串连接问题

时间:2012-10-27 06:25:48

标签: c++ string concatenation

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

工作:我接受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**

希望它能给出更明确的例子。

更新

我想我可能已经发现问题是由于文本文件造成的。我尝试创建一个内部有一些随机行的新文本文件,它似乎工作正常。但是,如果我尝试读取原始文件,它会给我错误的输出。仍然试图解决这个问题。

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

感谢您的帮助!欣赏它!

2 个答案:

答案 0 :(得分:2)

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

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

这里的问题是文本文件的内容。对于我的示例,文本文件中的最初7个字符是:“快速”。但是,紧随其后的是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控制字符也会产生相同的效果,例如回车符(Hex 0D)也会将光标移回左侧。

答案 1 :(得分: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

的内容

(这应该是一个评论而不是一个答案,但它太长了。抱歉。)