std::string += operator
std::string += operator
我这几天表现不好。我有一个std::字符串,在这个字符串上我使用+=运算符来添加另一个字符串(实际上是附加到路径的文件名)。当我运行程序时,我发现没有找到文件。Copious couts后来透露,我正在将文件名添加到字符串的开头。
std::string path("/home/me/location/");
std::string file("file.txt");
path += file;
std::cout << path.c_str();
它的输出是"file.txt/location"!!!我尝试了一个简单的程序,它只需将两个字符串添加在一起,就可以很好地工作,这是我所期望的(gcc v4.3)。我从windows机器上复制了代码,除了新的文件路径之外,我没有想到会有任何问题,它只真正使用STL和dirent,事实上,它或多或少是第一次编译的。我运行dos2unix只是以防万一。现在我有点困惑,但除了完全琐碎的事情之外,我以前还没有真正复制过代码,所以我可能错过了一些显而易见的东西。
路径名是否以某种方式附加了一个"\r",这样当您将其打印到cout时,它会打印"/home/me/location/",返回行首,然后打印"line.txt"?
正如有人所说,使用调试器查看变量。(我的直觉也是记录/打印,但调试器也很有用)
缺少目录名和文件名之间的/
分隔符。
否则,您发布的代码没有任何问题。
需要记住的一点是,您的代码会修改path
变量。如果对不同的文件名重复执行path += file
,请确保每次都重新初始化path
。
附言:你发布的四行代码不可能打印出file.txt/location
。要么发布的代码与正在运行的代码不同,要么输出不相同。
看起来file
以回车开始。如果是这种情况,+=
仍然会将file
附加到path
,但当字符串被定制时,它会显示您描述的行为。
您应该为此使用std::stringstream
:
std::stringstream tempss;
std::string path("/home/me/location");
std::string file("file.txt");
tempss << path;
tempss << file;
std::string filepath = tempss.str();
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 为什么当我使用 std::string::operator[] 时自动变量不会成为引用?
- C++ 重载:[错误] 与'operator='不匹配(操作数类型为 'String' 和"字符串")
- std::ostream::operator<< 未为 std::string 定义?
- 使用 std::string 时"error: no match for ‘operator<<"
- 为什么 std::string::append() 不如 std::string::operator+() 强大
- std::string::operator[]的结果地址是否指向一个可写的、以nul结尾的缓冲区
- std::string += operator
- 希望std::string::operator[]可以返回unsigned char
- std::string assign,clear和operator[]的奇怪行为
- 隐式转换和string::operator=()
- C++11 std::string::operator[]是否返回null终止的缓冲区
- 为什么在 std::string 上重载"operator <<"不起作用?
- 测试std::string对char*的相等性,operator==()是否总是安全的
- 使用 C++11 编译 UI 代码时面临"unable to find string literal operator"错误