Я только в 10-м классе, и есть упражнение, в котором я должен получить ввод, например (ввод = 1/2), и этот ввод нужно сохранить в двух разных целых числах, и я не знаю, как это сделать.
Любая помощь приветствуется.
Извините, если этот вопрос звучит глупо, но это мой первый пост здесь, и я не знаю этикета.
Заранее спасибо!
Привет, Даниэль, добро пожаловать в SO. Что вы пробовали до сих пор и где это пошло не так? Вы понимаете, как использовать getline
и строковые потоки? Всегда ли гарантируется, что формат вашей строки будет X/Y
, где X и Y — однозначные целые числа? Вы заботитесь о разборе этого /
или вы просто хотите выбросить его и сохранить целые числа?
Уточните, пожалуйста, где вы застряли. Как далеко вы продвинулись, а) запустив HelloWorld b) изменив его, чтобы он читал что-то, и просто выводите его как есть c) изменив его, чтобы он читал что-то вроде «1/2» d) изменив, чтобы ожидать что-то вроде «1/2» и получение "1" и "2" отдельно e) сохранение этих двух в разных переменных. Пожалуйста, покажите код того, что вы уже достигли, объясните, в чем заключается ваша конкретная проблема. В общем, пожалуйста, возьмите тур и прочитайте Как спросить.
Поскольку это похоже на домашнее задание, пожалуйста, изучите описанный здесь компромисс meta.stackoverflow.com/questions/334822/… Экскурсия здесь посвящена общей идее, а вопрос о том, как спросить, в основном об этикете для спрашивать. По крайней мере, тур был рекомендован вам при создании аккаунта, не так ли? В противном случае добро пожаловать в StackOverflow и позвольте мне выразить свое уважение за смелость этого сообщества и таких людей, как я, только в десятом классе. (без цинизма)
Я действительно ничего не пробовал, потому что я не знаю, как даже начать с этого. Мы не научились использовать getline, только с char(cin.getline(charname, size)). Да, формат всегда гарантирован, и да, они оба однозначные целые числа. Мне нужно использовать /, потому что ввод должен быть дробным. @scohe001
Извините, но "я ничего не пробовал" - это неправильный подход. Пожалуйста, следуйте инструкциям, которые я описал. Только это позволяет вам задать ясный и конкретный вопрос, который здесь ожидается.
Я хотел бы извиниться, потому что, как вы указали, это был не очень хороший вопрос. Я получил хорошие ответы, и я мог бы попытаться сделать что-то из них. В будущем я постараюсь задавать более качественные вопросы и постараюсь быть хорошим членом сообщества!
Не нужно извиняться - но сделайте это в какой-то момент. С++ IO тупой - принятый ответ, пожалуй, самый простой, и он особенно хорош, поскольку не срезает углы.
Решение:
Возьмите ввод как std::string
, а затем проанализируйте его.
Полный код:
#include <iostream>
std::pair<int,int> inputNumbers()
{
std::string input;
std::cout << "Input: ";
std::cin >> input;
size_t slashPos = input.find('/');
if (slashPos == input.npos || slashPos == 0 || slashPos == input.size() - 1)
{
std::cout << "Error! Please try again.\n";
exit(0);
}
std::pair<int,int> ret;
try
{
ret.first = std::stoi(input.substr(0,slashPos));
ret.second = std::stoi(input.substr(slashPos+1,input.size()-slashPos-1));
}
catch(std::invalid_argument&)
{
std::cout << "Error! Please try again.\n";
exit(0);
}
return ret;
}
int main() {
std::pair<int,int> inputs = inputNumbers();
std::cout << "First number: " << inputs.first << ". Second number: " << inputs.second << ".\n";
}
@Bathsheba: Ваш любимый не компилируется. Он выдает набор тестовых данных «5/» и «a/b». Это слишком сложно для этой цели
@ArminMontigny: К сожалению, в этом случае вы могли бы рассмотреть возможность понижения ответа. Мне нравится только то, что std::string
читается из ввода. Остальное не проверял, если честно.
(Сделал тривиальное редактирование и откатился, чтобы я мог отозвать свой голос. Глупое переполнение стека с его правилами «вы не можете передумать».)
Прочитайте два целых числа и проигнорируйте/сопоставьте символ между ними. Лучший способ сопоставить персонажа — это манипулятор:
std::istream& slash(std::istream& in) {
if ((in >> std::ws).peek() == '/') {
in.ignore();
}
else {
in.setstate(std::ios_base::failbit);
}
return *this;
}
int main() {
int numerator, denominator;
if (std::cin >> numerator >> slash >> denominator) {
std::cout << " read " << numerator << '/' << denominator << '\n';
}
}
Немного сложновато для такой простой задачи. . .
Абсолютно нет — ввод-вывод — это одна из тех вещей, сложность которых возрастает по мере развития проекта. Это не перегружено никаким воображением.
@ArminMontigny: да, было бы неплохо иметь стандартный библиотечный манипулятор для проверки/пропуска заданного символа. Как только вы предполагаете, что манипулятор slash
дан, я думаю, что это не так уж плохо. Это одна из вещей из scanf()
IOStreams, которые не покрываются: scanf("%d/%d\n", &numerator, &denominator)
(хотя я по-прежнему не рекомендую использовать scanf()
).
Просто используйте существующую функциональность iostream. В этом нет ничего сложного. Разбор строки не требуется. Оператор вставки пропускает пробелы. Кроме того, он преобразует заданные вами значения в целочисленную переменную. Косая черта будет прочитана, проверена и затем отброшена.
#include <iostream>
int main() {
int number1{}, number2{};
char slash{};
std::cout << "\nEnter a string: ";
if (std::cin >> number1 >> slash >> number2 && slash == '/') {
std::cout << "\n\nNumber 1: " << number1 << "\nNumber 2: " << number2 << "\n\n";
}
else {
std::cerr << "\nError: invalid input\n\n";
}
return 0;
}
Я знаю, что во многом это вопрос стиля (и некоторые производители программного обеспечения настаивают на этом), но в данном случае вам не нужно инициализировать автоматические переменные.
Все переменные всегда должны быть инициализированы. Для меня не может быть дискуссии об этом. Любой профессиональный разработчик программного обеспечения должен это сделать. Если вы водите машину с программным обеспечением break by wire, не примете ли вы никакие инициализированные переменные? На самом деле никто бы и никакую оценку не мог пройти. . .
... хотя это говорит о том, что я куплю немецкую машину в следующем году, так что, возможно, это обнадеживает. Хотя лично мне нравится сохранять переменные неинициализированными, и у меня включены проверки во время выполнения для любого пути, который считывает неинициализированные переменные. В моей области (финансовая математика — вы знаете бастион шерстяных программистов) это дает вам некоторую уверенность в том, что ваш код ведет себя.
Что-то вроде
std::string s; std::cin >> s;
Проверьте, соответствует ли оно тому, что вы ожидаете (используйтеstd::regex
), а затем проанализируйте на досуге.