Пример ответа @ Насера:
>>> 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]
cin >> number
только захватывает числа из буфера, он оставляет «вход» в буфере, который затем сразу же захватывается getline и интерпретируется как пустая строка (или строка только с новой строкой, я забываю ).
Похоже, вам нужно чтение на основе строки. Для этого вы, вероятно, захотите последовательно использовать 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;
}
Попробуйте
cout << "Enter name:";
cin.ignore();
getline(cin, str);
cin >> number // eat the numeric characters
getline(cin, str) // eat the remaining newline
Я думаю, проблема в том, что cin >>
передает символ новой строки (\n)
. Функция getline () предполагает, что символ новой строки является пробелом и передает его. Кто-то разместил решение, которое вы можете использовать.
Вы можете использовать манекен getline(cin, dummy);
или реальную вещь cin.ignore(100,'\n');
getline(cin, str);
читает новую строку, которая появляется после числа, прочитанного ранее, и немедленно возвращается с этой «строкой». Чтобы избежать этого, вы можете пропустить пробелы с помощью std::ws
перед чтением имени:
cout << "Enter number:";
cin >> number;
cout << "Enter name:";
ws(cin);
getline(cin, str);
...
Обратите внимание, что это также пропускает начальные пробелы после новой строки, поэтому str
не запускается с пробелами, даже если пользователь вводил их. Но в этом случае это, вероятно, функция, а не ошибка ...