Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: ввод строки в c++  (Прочитано 3868 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
ввод строки в c++
« : 10 Апреля 2010, 00:18:09 »
возник небольшой вопросик по си. есть вот такой код
#include <iostream>
#include <string>
#include <cstdlib>

int rate;

...

void menu()
{
std::string skill;
std::cout << "Выберите уровень сложности (easy, medium, hard): ";
std::cin >> skill;
if(skill.compare("easy") == 0) rate = 15;
else if(skill.compare("medium") == 0) rate = 25;
else if(skill.compare("hard") == 0) rate = 35;
else menu();
}

...

int main()
{

...

menu();

...

return 0;
}
проблема заключается вот в чем: на строке std::cin >> skill; программа зависает если ввести easy, medium или hard. решил так потому, что если после этой сторчки добавить std::cout << "работает \n"; вывод надписи не осуществляется.
если составить программу такого плана:
#include <iostream>
#include <string>

int rate;

int main()
{
std::string skill;
std::cout << "Выберите уровень сложности (easy, medium, hard): ";
std::cin >> skill;
std::cout << "работает \n";
if(skill.compare("easy") == 0) rate = 15;
else if(skill.compare("medium") == 0) rate = 25;
else if(skill.compare("hard") == 0) rate = 35;
else main();
}
все отрабатывается на ура. в чем может быть дело?
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: ввод строки в c++
« Ответ #1 : 10 Апреля 2010, 00:33:44 »
Первый вариант программы отрабатывается без проблем
 ???
Может, дело во всем остальном коде?
(компилил g++ 4.3.3)
« Последнее редактирование: 10 Апреля 2010, 00:37:42 от Saha »

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: ввод строки в c++
« Ответ #2 : 10 Апреля 2010, 00:50:08 »
видимо так оно и есть. закоментировал остальные строки и программа выполнилась. только вычислить ошибку не получается.
компилю тоже при помощи g++
(Нажмите, чтобы показать/скрыть)
это порт моего морского боя с паскаля (на нем я время от времени упражняюсь).
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: ввод строки в c++
« Ответ #3 : 10 Апреля 2010, 01:48:53 »
Бесконечной рекурсией балуемся? Выхода из menu() при правильном вводе как бы и нет ;)
Пустую строку тоже наверное надо как-то обрабатывать отдельно, ибо нажимать энтер можно долго.

Оффлайн Nubaseg

  • Участник
  • *
  • Сообщений: 131
    • Просмотр профиля
    • ЖЖ
Re: ввод строки в c++
« Ответ #4 : 10 Апреля 2010, 01:59:52 »
В меню, все верно. Хотя я бы переделал его так:
int menu()
{
   std::string skill;
   std::cout << "Выберите уровень сложности (easy, medium, hard): ";
   std::cin >> skill;                                             //та самая проблемная строка
   if(skill.compare("easy") == 0) return 15;
   else if(skill.compare("medium") == 0) return 25;
   else if(skill.compare("hard") == 0) return 35;
   else menu();
}
А в мейне rate = menu();

Но проблема не в нем, у тебя цикл похоже бесконечный - GeneratePos
flag - false
так вот я не вникал в логику, но в каждом case идет дополнительный if, все они без else, т.е. вполне реально что flag может никогда не стать true, а цикл идет while(flag == false). 90% что проблема здесь, разбирайся.

Пользователь решил продолжить мысль 10 Апреля 2010, 00:03:35:
З.Ы. писать проги без трейса и дебагера = садомазо :)
« Последнее редактирование: 10 Апреля 2010, 13:17:38 от Nubaseg »
Lenovo G570 + Xubuntu 12.04 LTS

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: ввод строки в c++
« Ответ #5 : 10 Апреля 2010, 11:22:38 »
Конечно, рекурсия в данном месте как бы совсем не к месту =)
Но с логикой работы функции menu() все в порядке, никакого зацикливание не будет (только переполнение стека будет когда-нибудь после до-о-олгого неправильного ввода =)

P.S. С функцией menu() все в порядке, дальше где-то ошибка, ищи =)
(Да, дебагер наверняка поможет=)
« Последнее редактирование: 10 Апреля 2010, 11:30:46 от Saha »

Оффлайн Nubaseg

  • Участник
  • *
  • Сообщений: 131
    • Просмотр профиля
    • ЖЖ
Re: ввод строки в c++
« Ответ #6 : 10 Апреля 2010, 13:40:26 »
Продебажил твою прогу в CodeBlocks -да как я и предполагал зацикливается  GeneratePos.
поставь себе CodeBlocks из репов, там есть нормальный дебагер.
Lenovo G570 + Xubuntu 12.04 LTS

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: ввод строки в c++
« Ответ #7 : 10 Апреля 2010, 22:07:02 »
заменил функцию GeneratePos на более простую и все заработало, спасибо.
а может ктото объяснить почему ошибка происходит не там где вызывается глючная функция?
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн maskimko

  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: ввод строки в c++
« Ответ #8 : 13 Апреля 2010, 15:39:37 »
А еще, чтобы не писать каждый раз std::
делаем using namespace std;

Пользователь решил продолжить мысль 13 Апреля 2010, 15:41:17:
А еще можно идентифицировать функцию как void menu(void);
« Последнее редактирование: 13 Апреля 2010, 15:41:17 от maskimko »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: ввод строки в c++
« Ответ #9 : 13 Апреля 2010, 19:10:27 »
maskimko, первый совет не самый лучший. так делать не стоит. лень объяснять погуглите кому интересно.

 

Страница сгенерирована за 0.061 секунд. Запросов: 25.