Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

01.09.2013, 14:44. Просмотров 803. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2013, 14:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос GCC, ввод строки в switch (C++):

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

Ввод строки - C++
Доброго времени суток форумчане. Вот возник вопрос: при вводе определенного текста мне нужно чтобы выдавало определенный результат, но...

Ввод строки в С++ - C++
Подскажите как сделать так, чтобы введенная строка (string) сохранилась без учета пробелов? а то getline пробелы тоже сохраняет, а cin...

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

Ввод строки - C++
Как ввести массив символов (строку)? (желательно все возможные варианты) А то через gets фигня какая-то получается.

Ввод строки - C++
У меня возникла такая проблема: как ввести строку из консоли. Написал вот что: cout&lt;&lt;&quot;Input time \&quot;hour:minute:second\&quot;\n&quot;; char...

14
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
01.09.2013, 14:51 #2
C++
1
2
3
4
5
6
7
8
void PRINT() // Вводим имя, потом оно выводится. Элементарно.
{
    string NAME;
    cout << "Введите имя: ";
    cin.sync();
    getline(cin, NAME);
    cout << "\nВы ввели: " << NAME << endl;
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
01.09.2013, 14:52 #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;
}
1
Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 15:19  [ТС] #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;
}

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

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

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

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

Не по теме:

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

0
Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 15:37  [ТС] #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.
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
01.09.2013, 15:43 #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();. Но толку никакого.
все работает.
0
Миниатюры
GCC, ввод строки в switch  
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
01.09.2013, 15:46 #11
http://typedef.ru/2011/08/how-to-discard-unread-chars-from-cin/
0
Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 15:50  [ТС] #12
Цитата Сообщение от Olivеr Посмотреть сообщение
все работает.
Вот код функции. Запустил, ничего не нажимал. Пропустился ввод, зависло.
В том и фишка, что не работает то, что должно работать.
0
Миниатюры
GCC, ввод строки в switch   GCC, ввод строки в switch  
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
01.09.2013, 15:50 #13
Цитата Сообщение от Olivеr Посмотреть сообщение
все работает.
В Линуксе не будет
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
01.09.2013, 15:51 #14
Michall, не знаю как на андроиде, но на винде все работает. Решение от Croessmah помогло надеюсь?
0
Michall
1 / 1 / 0
Регистрация: 31.10.2008
Сообщений: 52
01.09.2013, 16:06  [ТС] #15
Цитата Сообщение от Olivеr Посмотреть сообщение
Michall, не знаю как на андроиде, но на винде все работает. Решение от Croessmah помогло надеюсь?
Да, хотя этот код не моего уровня, ничего не понял.
Кстати, только сейчас заметил, что вы не просто процитировали код моей функции, а заменили cin.clear(); на cin.sync();

Отдохну немног, а то уже брейнфак, попалю.
0
01.09.2013, 16:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 16:06
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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