C++:奇怪的 std::cout 错误
Posted
技术标签:
【中文标题】C++:奇怪的 std::cout 错误【英文标题】:C++: Weird std::cout error 【发布时间】:2011-08-29 09:54:27 【问题描述】:我认为这将是一件相对简单的事情:在“www.google.ie”后面加上一个斜杠,并在它前面加上“http://”,从而得到一个值为“http”的字符串://www.google.ie/”。不,这不是家庭作业……(我知道)
现在这是我的代码:
std::string line=split1[0]; //split1[0] is "Host: www.google.ie"
std::vector<std::string> split2;
boost::split(split2,line,boost::is_any_of(" "));
boost::erase_all(split2[1],"\n");
std::cout<<"split2[1]:"<<split2[1]<<std::endl; //outputs www.google.ie ok
fURL="http://"+split2[1]+"/";
//fURL="http://www.google.ie/"; //this is what I want fURL to be!
std::cout<<std::endl; //just for some testing
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<"fURL:"<<fURL<<std::endl; //should output: http://www.google.ie/?
这是我奇怪的输出:
split2[1]:www.google.ie /URL:http://www.google.ie
我不知道“/URL:”中的“/”是从哪里来的。就好像我指定的尾部斜线以某种方式被附加到前面。我真的不明白这怎么可能......
在 Linux Ubuntu 上使用 g++ 4.5.2。
非常感谢任何见解。
非常感谢,
【问题讨论】:
std::cout << "fURL: http://" << split2[1] << "/" << std::endl;
的输出是什么?
输出为:"/URL: google.ie" ;(
对我来说没问题:ideone.com/M8H1H,您的代码中还有其他问题导致了这种情况……例如,fURL
的类型是什么?
@Nim。唔。很有意思。 (ideone.com 很酷)。肯定是有别的事情发生了……fURL的类型是“std::string”,在对应的头文件中声明。
您是否尝试过使用仅您发布的部分制作程序并验证错误确实存在?之后还要输出吗?
【参考方案1】:
我猜是这条线
//split1[0] 是“主机:www.google.ie”
和你说的不一样。例如,如果您通过 http 获得它,您将拥有
//split1[0] 是“主机:www.google.ie\r\n”
删除\n后是
//split1[0] 是“主机:www.google.ie\r”
那么fURL就是
fURL="http://"+split2[1]+"/"; // http://www.google.ie\r/
这个
std::cout<<"fURL:"<<fURL<<std::endl
将打印
fURL:http://www.google.ie
转到第一列 (\r) 并打印'/'覆盖第一个字符'f'
【讨论】:
@Eamorr:这可以通过在 split2[1] 和 std::endl 之间打印一些东西来轻松测试 Immilewsk - 这真的很有帮助。谢谢。我想我现在已经深究了...【参考方案2】:这是您的代码,放入一个小程序中,只需对您的代码的一次调用包装在 foo() 函数中。它可以按您的预期工作,并且不会像您观察到的那样做任何奇怪的事情。如果我遇到像你这样的问题,我总是用“奇怪”的代码编写一个小程序。正如其他人所建议的那样,必须有别的东西,那就是让事情出错。来,试试看:
#include <iostream>
#include <vector>
#include <string>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/erase.hpp>
using namespace std;
void foo(const char **split1)
std::string line = split1[0]; //split1[0] is "Host: www.google.ie"
std::vector<std::string> split2;
boost::split(split2,line,boost::is_any_of(" "));
boost::erase_all(split2[1],"\n");
std::cout<<"split2[1]:"<<split2[1]<<std::endl; //outputs www.google.ie ok
string fURL="http://"+split2[1]+"/";
//fURL="http://www.google.ie/"; //this is what I want fURL to be!
std::cout<<std::endl; //just for some testing
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<"fURL:"<<fURL<<std::endl; //should output: http://www.google.ie/?
int main()
const char *split = "Host: www.google.ie";
const char *split1[1];
split1[0] = split;
foo(split1);
return 0;
【讨论】:
以上是关于C++:奇怪的 std::cout 错误的主要内容,如果未能解决你的问题,请参考以下文章