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

时间:2009-02-06 05:07:07

标签: c++ string stl

我在一个返回字符串的类中有一个函数。在这个函数中,我只能在返回语句之前向函数添加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<<endl行,则该函数有效,输出为
 “a 0 | 0 | 12 | 12 | 0 | 0 | 2 | 1 | 1 | 1 | 1 | 2 |
b“

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

我做错了什么?是否有一些我缺少的东西?

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

cout 在程序结束时刷新。

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

int main() {
    std::cout << sizeof(int);
}
fow@lapbert ~ % ./a.out
4