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 &lt;&lt; "fURL: http://" &lt;&lt; split2[1] &lt;&lt; "/" &lt;&lt; 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 错误的主要内容,如果未能解决你的问题,请参考以下文章

c++奇怪的执行逻辑

C++ 向下转换对象的奇怪行为

C++:奇怪的除法输出

Visual Studio 2012 中的奇怪错误

std::unique_ptr::get() 的奇怪返回行为

C++ std::vector::size() 改变它的状态