getline的垃圾值

时间:2013-08-11 11:17:36

标签: c++ getline garbage

#include<iostream.h>
#include<conio.h>

void main()
{
    clrscr();
    char c[50];

    //cin>>c;
    cin.getline(c,50);

    //cout.write(c,50);
    cout<<c;
    getch();
}

如果输入少于50个字符的内容,我会得到垃圾值。为什么会这样?

3 个答案:

答案 0 :(得分:1)

您没有初始化数组:

#include<iostream>
#include<conio.h>
using std::cout;
using std::cin;

int main()
{
    clrscr();

    char c[50] = {};//initialize your array here!

    cin.getline(c,50);
    cout<<c;

    getch();

    return 0;
}

此外:

  • iostream.h已过时。
  • 如果您的目标是跨平台开发,请避免使用<conio.h>,因此代码中使用functions it definesclscr()getch()
  • 尽可能避免使用C-Strings,如果可以的话。您正在使用C ++,请使用:<string>库和std::string。在此处详细了解:Efficiency of C-String vs C++Strings
  • 使用cin.getline()可以对缓冲输入进行类似的论证,但我不知道你的最终目标,所以我无法对此作出充分的评论。但是,它似乎正在尝试进行缓冲输入。

答案 1 :(得分:0)

一种简单而干净的方法

#include<iostream>
#include<string>
int main()
{
    std::string str;
    getline(std::cin, str);
    cout<<str;
    std::cin.get();    //or std::cin.ignore();
}

需要注意的一些要点:

  1. 新标准指定main()的返回类型应为int而不是void。(不返回任何默认值为int返回)

  2. 即使getchar()已过时。

  3. 使用std::string insteead char数组,因为它易于安全实施

答案 2 :(得分:0)

我使用指定的答案也遇到了同样的问题,因为我没有意识到我的文件是以16位编码的。所以我不得不使用std :: wstring(和std :: wifstream)。