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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
#1

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

01.09.2013, 14:44. Просмотров 780. Ответов 14
Метки нет (Все метки)

Подскажите, почему не работает? (Что именно не работает написано в комментариях кода.)
Программа элементарная, специально сделал для примера. Все ведь верно, но не работает как задумано. При первой попытке ввода строки через 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
Посмотрите здесь:

Как в switch проверить элемент строки? - C++
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? Я попытался проверить элемент строки в switch. В смысле switch (s). Но...

ввод строки - C++
привет! у меня есть проблемка.. для начала прога: #include &lt;stdlib.h&gt; int main (void) { return system(&quot;ping 192.168.3.1&quot;); } ...

Ввод строки - C++
#include&lt;iostream&gt; #include&lt;clocale&gt; using namespace std; #define DEBUG class Monom{ protected: int Step,Kof; public: ...

Ввод строки - C++
Помогите решить такую проблему: Мне нужно ввести строку, которая состоит более 1 слова. когда я пишу: ... char a, b, c; cin&gt;&gt;a; ...

ввод строки - C++
вводиться строка. как выделить память под ровно то количество символов, которое ввели. как-то можно сначала узнать количество символов...

Ввод строки с пробелами - C++
Собственно вот текст, не хочет никакими функциями принимать строку stud.fio с пробелами, испробовал всё, до чего голова дошла. Нужно чтобы...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
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
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 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
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
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
01.09.2013, 15:21     GCC, ввод строки в switch #5
Цитата Сообщение от Michall Посмотреть сообщение
И странно, почему не работал мой первоначальный вариант. Или это баг компилятора?
Символ конца строки остался в потоке после ввода числа. Этот символ и считывал getline
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
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 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
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
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
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
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
01.09.2013, 15:46     GCC, ввод строки в switch #11
http://typedef.ru/2011/08/how-to-dis...hars-from-cin/
Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 15:50  [ТС]     GCC, ввод строки в switch #12
Цитата Сообщение от Olivеr Посмотреть сообщение
все работает.
Вот код функции. Запустил, ничего не нажимал. Пропустился ввод, зависло.
В том и фишка, что не работает то, что должно работать.
Миниатюры
GCC, ввод строки в switch   GCC, ввод строки в switch  
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
01.09.2013, 15:50     GCC, ввод строки в switch #13
Цитата Сообщение от Olivеr Посмотреть сообщение
все работает.
В Линуксе не будет
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
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++
Как считать строку с клавиатуры и оставить ее целой в буфере? Исходя из своих знаний, нашел только такой вариант: char a; ...

не запрашивает на ввод строки - C++
не понимаю почему не запрашивает ввода строки? Листинг ф-ии и там буквально надо подправить один штрих и все... не понимаю с чем связано,...

Ввод строки с пробелами - C++
Знающие, помогите решить такую проблему. Надо составить маленькую программку, представление аудио-коллекции, в общем дело не сложное ,...

Ввод/вывод строки - C++
#include &lt;iostream&gt; using std::cin; using std::cout; using std::endl; #include &lt;string&gt; using std::strlen; using...


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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru