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

Не срабатывает gets - C++

Восстановить пароль Регистрация
 
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 17:32     Не срабатывает gets #1
Ребят, не пойму почему, но строка с gets в ниже приведенном коде игнорируется - ввести мне ничего не дает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int ch;
     char str[80];
 
     do {
     cout << "   ****** Welcome!!! ******   " << '\n';
     cout << "(0) - exit" << '\n';
     cout << "(1) - get strlen" << '\n';
 
     cin >> ch;
 
     switch (ch) {
     case 0: break;
     case 1: cout <<" > Enter a string: ";
     gets(str); //сразу происходит вывод cout
     cout <<" > Lenght is - " << mystrlen(str) << '\n' << '\n';
     break;
     default: cout << " > Incorrect value!" << '\n' << '\n';
     }
     } while (ch!=0);
 
     return 0;
Пример:
Не срабатывает gets

Как видите, я ввожу "1" и после итого сразу выполняется:
C++
1
     cout <<" > Lenght is - " << mystrlen(str) << '\n' << '\n';
А возможность ввести строку после
C++
1
     case 1: cout <<" > Enter a string: ";
почему-то отсутствует.

Вот вопрос: почему? Где я намудрил?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2012, 17:32     Не срабатывает gets
Посмотрите здесь:

C++ Не срабатывает
C++ Не срабатывает #define
C++ Не срабатывает unique_copy
C++ Не срабатывает сортировка
C++ Не срабатывает конструктор класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
12.08.2012, 17:50     Не срабатывает gets #2
Возможно, из-за того, что cin считывает до первого пробельного символа или перевода строки,т.е. перевод строки остается во входном потоке.. Попробуй вставить перед gets getchar
-immortal-
 Аватар для -immortal-
60 / 60 / 24
Регистрация: 31.01.2011
Сообщений: 105
12.08.2012, 18:01     Не срабатывает gets #3
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
#include <iostream>
#include <string.h>
 
using namespace std;
int main()
{
    int ch;
    char str[80];
 
    do 
    {
         cout << "   ****** Welcome!!! ******   " << '\n';
         cout << "(0) - exit" << '\n';
         cout << "(1) - get strlen" << '\n';
 
         ch=getch();
 
         switch (ch) {
         case '0': break;
         case '1':  cout <<" > Enter a string: ";
                    gets(str); //сразу происходит вывод cout
                    cout <<" > Lenght is - " << strlen(str) << '\n' << '\n';
         break;
         default: cout << " > Incorrect value!" << '\n' << '\n';
         }
     }
    while (ch!=0);
 
    return 0;
}
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 18:34  [ТС]     Не срабатывает gets #4
Дык а все-таки почему cin нормально не сработал?
Цитата Сообщение от yleart Посмотреть сообщение
Возможно, из-за того, что cin считывает до первого пробельного символа или перевода строки
Ну да, он вроде так и считывает. Но почему перенос строки пришелся на gets?

-immortal-, после
C++
1
        ch=getch();
ch конвертится в char?

Просто
C++
1
    while (ch != 0);
не срабатывает, а вот так
C++
1
    while (ch != '0');
срабатывает.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
12.08.2012, 18:37     Не срабатывает gets #5
The_Immortal, Учите мат.часть!!!
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 18:45  [ТС]     Не срабатывает gets #6
Игорь с++, так в процессе Вот как раз занимаюсь по Шилдту сейчас. На примере и возник вопрос...

Вообще в изначальном примере везде используется cin для считывания, но меня не устроило считываение длины строки до пробела, поэтому и заменил на gets. Ну и впоследствии получил проблемы.
Но вот почему косяк с cin вышел и какого лешего после getch() переменная типа int воспринимается как char - в это врубиться не могу...

Добавлено через 5 минут
А все, getch() возвращает ASCII-код символа

Теперь осталось разобраться только с

Цитата Сообщение от The_Immortal Посмотреть сообщение
Но почему перенос строки пришелся на gets?
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
12.08.2012, 18:50     Не срабатывает gets #7
Цитата Сообщение от The_Immortal Посмотреть сообщение
Но почему перенос строки пришелся на gets?
Потому , что когда в cin вы что то ввели , а затем нажали Enter он передался в gets . Я лично раньше всегда использовал getch() на мой взгляд меньше гемороя , но как говорится на вкус и цвет , кстати раньше тоже сталкивался с данной проблемой.
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 18:59  [ТС]     Не срабатывает gets #8
Игорь с++, хм, смотрю, что данная проблема наблюдается только в сочетании cin + gets. В сочетании cin + cin проблем не возникает подобных: Enter во второй cin не передается.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
12.08.2012, 19:00     Не срабатывает gets #9
Цитата Сообщение от The_Immortal Посмотреть сообщение
Игорь с++, хм, смотрю, что данная проблема наблюдается только в сочетании cin + gets. В сочетании cin + cin проблем не возникает подобных.
именно!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2012, 23:25     Не срабатывает gets
Еще ссылки по теме:

C++ Не срабатывает вложенные If/else
Не срабатывает switch C++
C++ Не срабатывает цикл FOR

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

Или воспользуйтесь поиском по форуму:
-immortal-
 Аватар для -immortal-
60 / 60 / 24
Регистрация: 31.01.2011
Сообщений: 105
12.08.2012, 23:25     Не срабатывает gets #10
Цитата Сообщение от The_Immortal Посмотреть сообщение
Просто
Код C++
1
* * while (ch != 0); * *
не срабатывает, а вот так
Код C++
1
* * while (ch != '0');
срабатывает.
да да) просмотрел этот момент
Yandex
Объявления
12.08.2012, 23:25     Не срабатывает gets
Ответ Создать тему
Опции темы

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