我正在尝试连接一些字符串,但它可以在一个字符串中工作,但不能在另一个字符串中工作。
工作:我接受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**
希望它能给出更明确的例子。
更新
我想我可能已经发现问题是由于文本文件造成的。我尝试创建一个内部有一些随机行的新文本文件,它似乎工作正常。但是,如果我尝试读取原始文件,它会给我错误的输出。仍然试图解决这个问题。
然后我尝试将原始文件的内容复制到新文件中,它似乎工作正常。不太确定这里有什么问题。将继续测试,并希望它工作正常。
感谢您的帮助!欣赏它!
答案 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
。
(这应该是一个评论而不是一个答案,但它太长了。抱歉。)