除非涉及 endl,否则返回字符串的 C++ 函数不起作用...?

Posted

技术标签:

【中文标题】除非涉及 endl,否则返回字符串的 C++ 函数不起作用...?【英文标题】:C++ function that returns string doesn't work unless there's an endl involved...? 【发布时间】:2009-02-06 05:07:06 【问题描述】:

我在一个返回字符串的类中有一个函数。在这个函数内部,我只有在 return 语句之前将cout<<endl 添加到函数中时才能使其工作。知道为什么会这样,或者我该如何解决?我在 Mac 上的 Eclipse 中运行它

在“main.cpp”中:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
#include "Braid.h"
using namespace std;

static int size=3;

int main()  
Braid * b1 = new Braid(size);
b1->setCanon();//creates canonical braid. 

cout<<"a ";
cout<<b1->getName()<<endl;
cout<<" b ";
  

在“Braid.h”中:

  public:  
        Braid(int);  
        void setCanon();  
        string getName(); 
    ;  

在“Braid.cpp”中:

string Braid::getName()  
    string sName="";  

    /* body commented out
    for(int i=0; i<height; i++)
    
        for(int j=2; j<(width-2); j++)
            
                sName += boxes[i][j];
                sName += "|";
            
        

        */  
        //cout<<endl;
        return sName;
     

当我运行我的主代码时,没有注释该函数的主体,我得到的输出是"a 0|0|12|12|0|0|2|1|1|1 |1|2|"

它返回的“名称”是正确的,但它没有通过函数调用。如果我取消注释 //cout&lt;&lt;endl 行,该函数将起作用,我的输出是"a 0|0|12|12|0|0|2|1|1|1|1|2| b "

在注释掉函数体之后,它只创建一个空字符串并返回它,我的输出只有“a”,然后如果我添加 endl,我会得到预期的“a b”。

我做错了什么? endl 有什么我缺少的东西吗?

【问题讨论】:

【参考方案1】:

实际上 getName() 函数可能工作正常。但是,cout 会“缓存”输出(即,当内部文本缓冲区已满时,它会在屏幕上打印输出)。 'endl' 刷新缓冲区并强制 cout 将文本(在缓存中)转储到屏幕。

在 main.cpp 中尝试 cout.flush()

【讨论】:

成功了。我猜 cout 并不像我想的那样工作。无论如何,谢谢! cout 与其说是真正的打印语句,不如说是存储输出的地方。【参考方案2】:

也许你的终端很懒。尝试省略 endl 并插入 cout.flush() 作为下一行。

【讨论】:

【参考方案3】:

cout 应该在程序结束时刷新。

fow@lapbert ~ % cat blah.cpp
#include <iostream>

int main() 
    std::cout << sizeof(int);

fow@lapbert ~ % ./a.out
4

【讨论】:

我遇到过一些旧的 Sun 工作站,但没有。

以上是关于除非涉及 endl,否则返回字符串的 C++ 函数不起作用...?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 函数返回字符串

C++ 函数中返回字符串的一个陷阱

c++中如何获取函数名,和获取到一个基类指针后,如何判断它里面保存的是那个子类类型对象?

C++中关于返回空指针问题

c++ cin返回值问题

C++ 函数返回与函数设置指针