Лямбда-авто с функцией ввода в C ++ дает ошибки - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь сделать функцию ввода похожую на ту, что в python input(), но из-за способа, которым функции возвращают переменные, они должны быть в формате типа функции void, int, std::string, поэтому, когда пользователь вводит строку, она устанавливается к тому, что когда-либо должно возвращаться (IE int print() будет означать, что возвращение также должно быть int, так что 9 = 57). Вот мое текущее состояние кода и пример того, что я хочу, чтобы происходило против того, что происходит.

//Input
auto input = [](const auto& message = "") {
    std::cout << message;
    const auto& x = std::cin.get();
    return x;
};

const auto& a = input("Input: ");
print(a);

С этим текущим кодом, когда я набираю 9 в консоли, он возвращает a как 57 . Я надеялся, что он вернет это просто 9 , но это, очевидно, не int, как я набрал его на своей клавиатуре. Он также возвращает входную «строку» как 115 , я понятия не имею, почему это происходит. В конечном итоге я хотел бы, чтобы он функционировал как питоны input() и возвращал его как строку. 9 = 9 и 'string' = 'string.

Ответы [ 4 ]

0 голосов
/ 28 апреля 2018

Если вы хотите, чтобы поведение было ближе к реальной функции Python input() (на самом деле, raw_input(), поскольку вы все равно не можете оценить Python в этом контексте), вы можете сделать следующее:

using EOFError = std::exception;

template <typename T = std::string>
std::string raw_input(T prompt = {}) {
  std::cout << prompt;
  std::string line;
  if (!std::getline(std::cin, line)) {
    throw EOFError();
  }
  return line;
}

Это также будет определять, когда вы получили EOF (когда поток, которым манипулирует getline(), больше не действителен - в идеале вы должны проверить eofbit здесь).

0 голосов
/ 28 апреля 2018

'9'! = 9.

В вашем случае (ascii) '9' равно 54.
таким же образом 's' (первый символ "string") равен 115.

const auto& x = std::cin.get(); возвращает int. так что ваша лямбда возвращает int и печатает вашего персонажа как int.

Вы можете использовать std::string:

std::string s;
std::cin >> s;
return s;
0 голосов
/ 28 апреля 2018

Если вы хотите что-то вроде python input(), я думаю, что в этом случае вам следует жестко кодировать std::string тип.

auto input = [](const std::string& message = "") {
    std::cout << message;
    std::string x;
    std::cin >> x;
    return x;
};
//print can be auto to be more generic
auto print = [](const auto& message) {std::cout << message << std::endl;};
auto a = input("Input: "); //a is a string 
print(a); 

Если вы введете int и хотите вернуть int, вы можете преобразовать его, используя stoi

auto b = std::stoi(input("Input: ")); //convert string to int, and b is an int
print(b); 

UPDATE Поскольку python input читает всю строку сразу, но std::cin >> x; будет читать только до первого пробела,

std::getline(std::cin, x);//This will read the whole line including spaces

может быть лучшим решением.

0 голосов
/ 28 апреля 2018

std::cin.get(); извлекает символ и возвращает его значение ascii как int.

Когда вы пишете const auto& x = std::cin.get(); и вставляется '9', возвращается значение ascii '9', которое равно 57.

...