Как я могу получить 2 целочисленных значения из одного ввода?

Я только в 10-м классе, и есть упражнение, в котором я должен получить ввод, например (ввод = 1/2), и этот ввод нужно сохранить в двух разных целых числах, и я не знаю, как это сделать.

Любая помощь приветствуется.

Извините, если этот вопрос звучит глупо, но это мой первый пост здесь, и я не знаю этикета.

Заранее спасибо!

Что-то вроде std::string s; std::cin >> s; Проверьте, соответствует ли оно тому, что вы ожидаете (используйте std::regex), а затем проанализируйте на досуге.

Bathsheba 23.12.2020 16:11

Привет, Даниэль, добро пожаловать в SO. Что вы пробовали до сих пор и где это пошло не так? Вы понимаете, как использовать getline и строковые потоки? Всегда ли гарантируется, что формат вашей строки будет X/Y, где X и Y — однозначные целые числа? Вы заботитесь о разборе этого / или вы просто хотите выбросить его и сохранить целые числа?

scohe001 23.12.2020 16:11

Уточните, пожалуйста, где вы застряли. Как далеко вы продвинулись, а) запустив HelloWorld b) изменив его, чтобы он читал что-то, и просто выводите его как есть c) изменив его, чтобы он читал что-то вроде «1/2» d) изменив, чтобы ожидать что-то вроде «1/2» и получение "1" и "2" отдельно e) сохранение этих двух в разных переменных. Пожалуйста, покажите код того, что вы уже достигли, объясните, в чем заключается ваша конкретная проблема. В общем, пожалуйста, возьмите тур и прочитайте Как спросить.

Yunnosch 23.12.2020 16:12

Поскольку это похоже на домашнее задание, пожалуйста, изучите описанный здесь компромисс meta.stackoverflow.com/questions/334822/… Экскурсия здесь посвящена общей идее, а вопрос о том, как спросить, в основном об этикете для спрашивать. По крайней мере, тур был рекомендован вам при создании аккаунта, не так ли? В противном случае добро пожаловать в StackOverflow и позвольте мне выразить свое уважение за смелость этого сообщества и таких людей, как я, только в десятом классе. (без цинизма)

Yunnosch 23.12.2020 16:15

Я действительно ничего не пробовал, потому что я не знаю, как даже начать с этого. Мы не научились использовать getline, только с char(cin.getline(charname, size)). Да, формат всегда гарантирован, и да, они оба однозначные целые числа. Мне нужно использовать /, потому что ввод должен быть дробным. @scohe001

DanielXdHunter 23.12.2020 16:18

Извините, но "я ничего не пробовал" - это неправильный подход. Пожалуйста, следуйте инструкциям, которые я описал. Только это позволяет вам задать ясный и конкретный вопрос, который здесь ожидается.

Yunnosch 23.12.2020 16:20

Я хотел бы извиниться, потому что, как вы указали, это был не очень хороший вопрос. Я получил хорошие ответы, и я мог бы попытаться сделать что-то из них. В будущем я постараюсь задавать более качественные вопросы и постараюсь быть хорошим членом сообщества!

DanielXdHunter 23.12.2020 16:29

Не нужно извиняться - но сделайте это в какой-то момент. С++ IO тупой - принятый ответ, пожалуй, самый простой, и он особенно хорош, поскольку не срезает углы.

Bathsheba 23.12.2020 17:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Решение:

Возьмите ввод как 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». Это слишком сложно для этой цели

A M 23.12.2020 16:41

@ArminMontigny: К сожалению, в этом случае вы могли бы рассмотреть возможность понижения ответа. Мне нравится только то, что std::string читается из ввода. Остальное не проверял, если честно.

Bathsheba 23.12.2020 16:50

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

Bathsheba 23.12.2020 16:51

Прочитайте два целых числа и проигнорируйте/сопоставьте символ между ними. Лучший способ сопоставить персонажа — это манипулятор:

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';
    }
}

Немного сложновато для такой простой задачи. . .

A M 23.12.2020 16:28

Абсолютно нет — ввод-вывод — это одна из тех вещей, сложность которых возрастает по мере развития проекта. Это не перегружено никаким воображением.

Bathsheba 23.12.2020 16:29

@ArminMontigny: да, было бы неплохо иметь стандартный библиотечный манипулятор для проверки/пропуска заданного символа. Как только вы предполагаете, что манипулятор slash дан, я думаю, что это не так уж плохо. Это одна из вещей из scanf() IOStreams, которые не покрываются: scanf("%d/%d\n", &numerator, &denominator) (хотя я по-прежнему не рекомендую использовать scanf()).

Dietmar Kühl 23.12.2020 16:31
Ответ принят как подходящий

Просто используйте существующую функциональность 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;
}

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

Bathsheba 23.12.2020 16:35

Все переменные всегда должны быть инициализированы. Для меня не может быть дискуссии об этом. Любой профессиональный разработчик программного обеспечения должен это сделать. Если вы водите машину с программным обеспечением break by wire, не примете ли вы никакие инициализированные переменные? На самом деле никто бы и никакую оценку не мог пройти. . .

A M 23.12.2020 16:45

... хотя это говорит о том, что я куплю немецкую машину в следующем году, так что, возможно, это обнадеживает. Хотя лично мне нравится сохранять переменные неинициализированными, и у меня включены проверки во время выполнения для любого пути, который считывает неинициализированные переменные. В моей области (финансовая математика — вы знаете бастион шерстяных программистов) это дает вам некоторую уверенность в том, что ваш код ведет себя.

Bathsheba 23.12.2020 16:53

Другие вопросы по теме