Форум программистов, компьютерный форум CyberForum.ru

GCC, ввод строки в switch - C++

Восстановить пароль Регистрация
 
Michall
 Аватар для Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 14:44     GCC, ввод строки в switch #1
Подскажите, почему не работает? (Что именно не работает написано в комментариях кода.)
Программа элементарная, специально сделал для примера. Все ведь верно, но не работает как задумано. При первой попытке ввода строки через switch, ввод строки завершается автоматический, не введя даже ни одного символа.
Компилятор GCC. Пытаюсь запустить на OC Android. Что через C4droid, что через CCTools, результат один и тот же.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string>
#include <iostream>
using namespace std;
 
void PRINT() // Вводим имя, потом оно выводится. Элементарно.
{
   string NAME;
   cout << "Введите имя: ";
   cin.clear();
   getline(cin, NAME);
   cout << "\nВы ввели: " << NAME << endl;
}
 
int main()
{
   PRINT(); // Вызываем функцию. Работает.
   cout << endl;
 
/* Самое интересное */
 
   int choice;
   cout << "Введите \"1\",\"2\" или \"3\" для вызова нужной функции.\n";
   cin >> choice;
   cout << endl;
   switch(choice)
   {
      case 1:
        PRINT(); // НЕ РАБОТАЕТ!
        break;
      case 2:
        PRINT(); // Не работает.
        PRINT(); // Эта работает.
        break;
      case 3: // Конечно, это тоже не работает.
        string NAME;
        cout << "Введите имя: ";
        cin.clear();
        getline(cin, NAME);
        cout << "\nВы ввели: " << NAME << endl;
   }
   return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2013, 14:44     GCC, ввод строки в switch
Посмотрите здесь:

C++ ввод строки
C++ с++ ввод строки и ....
C++ Ввод строки
C++ Ввод строки
Ввод строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
01.09.2013, 14:51     GCC, ввод строки в switch #2
C++
1
2
3
4
5
6
7
8
void PRINT() // Вводим имя, потом оно выводится. Элементарно.
{
    string NAME;
    cout << "Введите имя: ";
    cin.sync();
    getline(cin, NAME);
    cout << "\nВы ввели: " << NAME << endl;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
01.09.2013, 14:52     GCC, ввод строки в switch #3
Если ввод с консоли, то можно так попробовать:
C++
1
2
3
4
5
6
7
8
9
10
11
void PRINT() // Вводим имя, потом оно выводится. Элементарно.
{
   string NAME;
   cout << "Введите имя: ";
   cin.clear();
   bool state = std::ios::sync_with_stdio ( false ) ;
   std::cin.ignore ( std::cin.rdbuf ( ) -> in_avail ( ) ) ;
   getline(cin, NAME);
   std::ios::sync_with_stdio ( state ) ;
   cout << "\nВы ввели: " << NAME << endl;
}
Michall
 Аватар для Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 15:19  [ТС]     GCC, ввод строки в switch #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Если ввод с консоли, то можно так попробовать:
C++
1
2
3
4
5
6
7
8
9
10
11
void PRINT() // Вводим имя, потом оно выводится. Элементарно.
{
   string NAME;
   cout << "Введите имя: ";
   cin.clear();
   bool state = std::ios::sync_with_stdio ( false ) ;
   std::cin.ignore ( std::cin.rdbuf ( ) -> in_avail ( ) ) ;
   getline(cin, NAME);
   std::ios::sync_with_stdio ( state ) ;
   cout << "\nВы ввели: " << NAME << endl;
}
Ничего себе! Работает.
Кликните здесь для просмотра всего текста


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <string>
#include <iostream>
using namespace std;
 
void PRINT() // Вводим имя, потом оно выводится. Элементарно.
{
   string NAME;
   cout << "Введите имя: ";
   cin.clear();
   getline(cin, NAME);
   cout << "\nВы ввели: " << NAME << endl;
}
 
void PRINTpro() // Вводим имя, потом оно выводится. Элементарно.
{
   string NAME;
   cout << "(Pro version)/Введите имя: ";
   cin.clear();
   bool state = std::ios::sync_with_stdio ( false ) ;
   std::cin.ignore ( std::cin.rdbuf ( ) -> in_avail ( ) ) ;
   getline(cin, NAME);
   std::ios::sync_with_stdio ( state ) ;
   cout << "\nВы ввели: " << NAME << endl;
}
 
int main()
{
   PRINT(); // Вызываем функцию. Работает.
   cout << endl;
 
/* Самое интересное */
 
   int choice;
   cout << "Введите \"1\",\"2\" или \"3\" для вызова нужной функции. \"4\" для вызова хардкор версии.\n";
   cin >> choice;
   cout << endl;
   switch(choice)
   {
      case 1:
        PRINT(); // НЕ РАБОТАЕТ!
        break;
      case 2:
        PRINT(); // Не работает.
        PRINT(); // Эта работает.
        break;
      case 3: // Конечно, это тоже не работает.
      { string NAME;
        cout << "Введите имя: ";
        cin.clear();
        getline(cin, NAME);
        cout << "\nВы ввели: " << NAME << endl;
        break;
      }  // Пришлось добавить скобки, ибо не компилировалось. wtf?
      case 4:
        PRINTpro(); // Магия! Работает.
        break;
   }
   return 0;
}

Только я абсолютно не понял, как это работает.

И странно, почему не работал мой первоначальный вариант. Или это баг компилятора?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
01.09.2013, 15:21     GCC, ввод строки в switch #5
Цитата Сообщение от Michall Посмотреть сообщение
И странно, почему не работал мой первоначальный вариант. Или это баг компилятора?
Символ конца строки остался в потоке после ввода числа. Этот символ и считывал getline
Michall
 Аватар для Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 15:25  [ТС]     GCC, ввод строки в switch #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Символ конца строки остался в потоке после ввода числа. Этот символ и считывал getline
Но ведь cin.clear(); был перед getline(cin, NAME);.
Он как раз и должен очищать поток.
В Qt Creator, например, это все работает отлично.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
01.09.2013, 15:29     GCC, ввод строки в switch #7
Цитата Сообщение от Michall Посмотреть сообщение
Он как раз и должен очищать поток.
clear сбрасывает флаги ошибок.

Добавлено через 1 минуту
Цитата Сообщение от Michall Посмотреть сообщение
// Пришлось добавить скобки, ибо не компилировалось. wtf?
Потому что объявляете переменную внутри case

Добавлено через 1 минуту
Почему в switch нельзя определять переменные?
castaway
01.09.2013, 15:31
  #8

Не по теме:

Цитата Сообщение от Michall Посмотреть сообщение
В Qt Creator, например, это все работает отлично.
QT Creator - это компилятор?

Michall
 Аватар для Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 15:37  [ТС]     GCC, ввод строки в switch #9
Цитата Сообщение от Croessmah Посмотреть сообщение
clear сбрасывает флаги ошибок.
Да, точно, как раз смотрел тему Не очищается поток после cin.clear(). В ней советуют "Попробуй после cin.clear(); добавить cin.sync();", но в таком порядке прога пропускает ввод и зависает.

Добавил cin.sync();. Но толку никакого.
C++
1
2
3
4
5
6
7
8
9
void PRINT() // Вводим имя, потом оно выводится. Элементарно.
{
   string NAME;
   cout << "Введите имя: ";
   cin.sync(); // Добавил. Если будет после cin.clear(); прога зависает. Даже при вызове из mian().
   cin.clear();
   getline(cin, NAME);
   cout << "\nВы ввели: " << NAME << endl;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
   PRINT(); // Вызываем функцию. По прежнему работает.
   cout << endl;
 
   int choice;
   cout << "Введите \"1\",\"2\" для вызова нужной функции.\n";
   cin >> choice;
   cout << endl;
   switch(choice)
   {
      case 1:
        PRINT(); // Не работает.
        break;
      case 2:
        PRINT(); // Не работает.
        PRINT(); // Эта работает.
        break;
   }
   return 0;
}
________________
Цитата Сообщение от castaway Посмотреть сообщение

Не по теме:

QT Creator - это компилятор?

IDE.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
01.09.2013, 15:43     GCC, ввод строки в switch #10
Michall, внимательнее смотрим на код:
C++
1
2
3
4
5
6
7
8
void PRINT() // Вводим имя, потом оно выводится. Элементарно.
{
    string NAME;
    cout << "Введите имя: ";
    cin.sync();
    getline(cin, NAME);
    cout << "\nВы ввели: " << NAME << endl;
}
Цитата Сообщение от Michall Посмотреть сообщение
Добавил cin.sync();. Но толку никакого.
все работает.
Миниатюры
GCC, ввод строки в switch  
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
01.09.2013, 15:46     GCC, ввод строки в switch #11
http://typedef.ru/2011/08/how-to-dis...hars-from-cin/
Michall
 Аватар для Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 15:50  [ТС]     GCC, ввод строки в switch #12
Цитата Сообщение от Olivеr Посмотреть сообщение
все работает.
Вот код функции. Запустил, ничего не нажимал. Пропустился ввод, зависло.
В том и фишка, что не работает то, что должно работать.
Миниатюры
GCC, ввод строки в switch   GCC, ввод строки в switch  
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
01.09.2013, 15:50     GCC, ввод строки в switch #13
Цитата Сообщение от Olivеr Посмотреть сообщение
все работает.
В Линуксе не будет
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
01.09.2013, 15:51     GCC, ввод строки в switch #14
Michall, не знаю как на андроиде, но на винде все работает. Решение от Croessmah помогло надеюсь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 16:06     GCC, ввод строки в switch
Еще ссылки по теме:

C++ Ввод строки в С++
Ввод строки C++
Как в switch проверить элемент строки? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Michall
 Аватар для Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 16:06  [ТС]     GCC, ввод строки в switch #15
Цитата Сообщение от Olivеr Посмотреть сообщение
Michall, не знаю как на андроиде, но на винде все работает. Решение от Croessmah помогло надеюсь?
Да, хотя этот код не моего уровня, ничего не понял.
Кстати, только сейчас заметил, что вы не просто процитировали код моей функции, а заменили cin.clear(); на cin.sync();

Отдохну немног, а то уже брейнфак, попалю.
Цитата Сообщение от Croessmah Посмотреть сообщение
Yandex
Объявления
01.09.2013, 16:06     GCC, ввод строки в switch
Ответ Создать тему
Опции темы

Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru