cin.getline () с большим размером - PullRequest
4 голосов
/ 19 мая 2011
#include<iostream>
using namespace std;

int main()
{
   char test[10];
   char cont[10];

   cin.getline(test,10);
   cin.getline(cont,10);

   cout<<test<<" is not "<<cont<<endl;
    return 0;
}

При вводе:

12345678901234567890

вывод:

123456789

Кажется, cont пусто.Может ли кто-нибудь объяснить это?

Ответы [ 5 ]

7 голосов
/ 19 мая 2011

istream::getline устанавливает бит сбоя, если вход слишком длинный, и это препятствует дальнейшему вводу.Измените свой код на:

#include<iostream>
using namespace std;

int main()
{
   char test[10];
   char cont[10];

   cin.getline(test,10);
   cin.clear();                    // add this
   cin.getline(cont,10);

   cout<<test<<" is not "<<cont<<endl;
    return 0;
}
3 голосов
/ 19 мая 2011

Если переменная, в которую вы читаете, недостаточно велика, чтобы вместить всю строку, операция ввода завершится неудачно, и поток не будет больше ничего читать, пока вы не вызовете cin.clear().

Вы должны использовать вместо этого std :: string для хранения данных. Он изменит свой размер, чтобы соответствовать вводу.

std::string test;
std::string cont;

getline(cin, test);
getline(cin, cont);
0 голосов
/ 05 августа 2017

Функция getline () имеет следующие два синтаксиса:

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

s: Указатель на массив символов, где извлеченные символы хранятся в виде c-строки.

n: Максимальное количество символов для записи в s (включая завершающий нулевой символ).

разделитель: Явный разделительный символ

Возвращаемый тип этой функции: istream object (*this).

В приведенном выше сценарии данные считываются в указатель в массив символов test, который преобразуется во время выполнения и, следовательно, может хранить до 50 символов, как объявлено в cin.getline(test, 50).

Если вы хотите достичь желаемого результата, пожалуйста, используйте n=10

0 голосов
/ 19 мая 2011

Скопировано откуда-либоили '\ n' в противном случае).Извлечение также останавливается, если достигнут конец файла во входной последовательности или если во время операции ввода возникает ошибка.

Я полагаю, что вы дважды нажали клавишу ввода после ввода 12345678901234567890

0 голосов
/ 19 мая 2011

Стандарт гласит, что вы можете получить "более короткую" строку, чем та, которую вы ввели при следующих условиях:

  1. Используемый вами C ++ может не соответствовать стандарту.- невозможно.
  2. Вы попали куда-нибудь в персонаж EOF.

Я думаю, можно изменить char[] на string (STL), а затем попробовать его.Кроме того, когда вы говорите, что вводите 12345678901234567890 за один раз, все это входит в test.А поскольку длина test составляет всего 10 байтов, будет выведено 123456789.Ничего не вводится в продолжение, так как failbit установлен для класса istream и дальнейший ввод запрещен.Этот код работает для меня с std::string.

    #include<iostream>
    #include <string>
    using namespace std;

    int main()
    {
       //char test[10];
       //char cont[10];

       string test;
       string cont;

       cin >> test;
       cin >> cont;

       //cin.getline(test,10);
       //cin.getline(cont,10);

       cout<<test<<" is not "<<cont<<endl;
        return 0;

}
...