Мусорное значение с getline

#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 символов. Почему это так ?


person user2671725    schedule 11.08.2013    source источник
comment
Инициализируйте свой массив: c[50]   -  person jrd1    schedule 11.08.2013
comment
Кроме того, пожалуйста, используйте стандартный код C++. Нет void main, и не забудьте включить соответствующих участников из namespace std;.   -  person jrd1    schedule 11.08.2013
comment
Вместо этого вы должны использовать std::string s; std::getline(std::cin, s);.   -  person jamesdlin    schedule 11.08.2013
comment
iostream.h не является стандартным заголовком (как и conio.h, но это немного другое).   -  person chris    schedule 11.08.2013


Ответы (3)


Вы не инициализировали свой массив:

#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> и, следовательно, функций, которые он определяет используемые в вашем коде: clscr() и getch().
  • По возможности избегайте C-String. Вы используете C++, используйте: библиотеку <string> и std::string. Подробнее об этом читайте здесь: Эффективность C-String и C++Strings
  • Аналогичный аргумент можно привести для буферизованного ввода, используя cin.getline(), но я не знаю вашей конечной цели, поэтому не могу адекватно это прокомментировать. Но похоже, что вы пытаетесь сделать буферизованный ввод.
person jrd1    schedule 11.08.2013

Простой и чистый подход

#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 вместо char, так как это легко и безопасно реализовать

person Saksham    schedule 11.08.2013

У меня также была такая же проблема с использованием указанных ответов, потому что я не осознавал, что мой файл был закодирован в 16 бит. Поэтому мне пришлось использовать std::wstring (и std::wifstream).

person MGamsby    schedule 04.05.2016