in for loop, если я напишу функцию getline, которая неправильно работает в цикле c ++ для цикла, будет выполнена для ввода пользователем [duplicate]

Пример ответа @ Насера:

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(columns=['lib', 'qty1', 'qty2'])
>>> for i in range(5):
>>>     df.loc[i] = [np.random.randint(-1,1) for n in range(3)]
>>>
>>> print(df)
    lib  qty1  qty2
0    0     0    -1
1   -1    -1     1
2    1    -1     1
3    0     0     0
4    1    -1    -1

[5 rows x 3 columns]
18
задан jjnguy 16 November 2009 в 21:33
поделиться

6 ответов

cin >> number

только захватывает числа из буфера, он оставляет «вход» в буфере, который затем сразу же захватывается getline и интерпретируется как пустая строка (или строка только с новой строкой, я забываю ).

2
ответ дан Ape-inago 26 August 2018 в 21:58
поделиться
  • 1
    cin & gt; номер, нет? – pmr 16 November 2009 в 21:49
  • 2
    Да, он набрал это неправильно. – Secko 16 November 2009 в 21:52
  • 3
    @Secko Да, и это именно то, что я хотел сообщить. Прошу прощения, если я оказался груб. – pmr 16 November 2009 в 22:05
  • 4
    возгласы. Я не использовал потоки через некоторое время, я забыл направление этих операторов. – Ape-inago 18 November 2009 в 15:44

Похоже, вам нужно чтение на основе строки. Для этого вы, вероятно, захотите последовательно использовать getline, а затем проанализировать каждую строку, если вам нужно проанализировать число из строки чтения. Это делает чтение ввода более последовательным.

Таким образом, вам не нужно вручную проверять конец каждой строки, чтобы гарантировать, что следующая операция чтения начинается с новой строки.

Это также упрощает добавление обработки ошибок для повторения запросов ввода.

, например

#include <string>
#include <iostream>
#include <istream>
#include <ostream>
#include <sstream>

int parse_integer(const std::string& input)
{
    std::istringstream iss(input);
    int result;
    if (!(iss >> result))
    {
        // error - throw something?
    }
    return result;
}

int main()
{
    int number;
    std::string str;
    int accountNumber;

    std::string inputline;

    std::cout << "Enter number: ";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    number = parse_integer(inputline);

    std::cout << "Enter name:";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    str = inputline;

    std::cout << "Enter account number:";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    accountNumber = parse_integer(inputline);

    return 0;
}
4
ответ дан CB Bailey 26 August 2018 в 21:58
поделиться

Попробуйте

cout << "Enter name:";
cin.ignore();
getline(cin, str);
13
ответ дан DanDan 26 August 2018 в 21:58
поделиться
cin >> number // eat the numeric characters
getline(cin, str) // eat the remaining newline
3
ответ дан just somebody 26 August 2018 в 21:58
поделиться

Я думаю, проблема в том, что cin >> передает символ новой строки (\n). Функция getline () предполагает, что символ новой строки является пробелом и передает его. Кто-то разместил решение, которое вы можете использовать.

Вы можете использовать манекен getline(cin, dummy); или реальную вещь cin.ignore(100,'\n');

1
ответ дан Secko 26 August 2018 в 21:58
поделиться

getline(cin, str); читает новую строку, которая появляется после числа, прочитанного ранее, и немедленно возвращается с этой «строкой». Чтобы избежать этого, вы можете пропустить пробелы с помощью std::ws перед чтением имени:

cout << "Enter number:";
cin >> number;
cout << "Enter name:";
ws(cin);
getline(cin, str);
...

Обратите внимание, что это также пропускает начальные пробелы после новой строки, поэтому str не запускается с пробелами, даже если пользователь вводил их. Но в этом случае это, вероятно, функция, а не ошибка ...

17
ответ дан sth 26 August 2018 в 21:58
поделиться
  • 1
    Обратите внимание, что этот метод не позволяет пользователю вводить пустую строку. – interjay 27 September 2012 в 14:44
Другие вопросы по тегам:

Похожие вопросы: