Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 05.05.2017
Сообщений: 2
1

Как заменить getche() на OSX для данной программы

05.05.2017, 23:40. Показов 2456. Ответов 6
Метки нет (Все метки)

Здравствуйте!
Начал изучать с++ по учебнику Лафоре и столкнулся с проблемой. Очень много в дальнейшем курсе будет использоваться функция getche(), которая входит в conio.h, а её, понятное дело нет на OSX.
Банальный пример задачи. Написать программу подсчитывающую количество слов и символов в строке, вводимой пользователем с клавиатуры.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
#include <conio.h>
int main()
    {
        int chcount = 0;
        int wdcount = 1;
        char ch='a';
        cout << "Введите строку:";
        while(ch != '\r')
        {
            ch = getche();
            if(ch == ' ')
                wdcount++;
            else
                chcount++;
        }
        cout << "\nСлов:" << wdcount << endl
        << "Букв:" << (chcount-1)<<endl;
        return 0;
    }
Если заменить getche на getchar, то программа просто считывает данные, никак не реагирует. Т.е просто бесконечно можно вводить текст.
Как можно максимально просто и похоже обойти проблему (чтобы дальше по учебнику заниматься)?

PS Пишу на XCode
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2017, 23:40
Ответы с готовыми решениями:

Как сделать проверку вводимых чисел через val для данной программы?
Вот собственно сама программа. uses crt; var m,no: array of integer; n,j,i,a,b,k: integer;...

Подключение lib-файла FFTW для сборки проекта для android из OSX
Привет всем! Я только новичек в QT, не судите строго) Собираю проект под Android с OSX....

Сделать потоки для данной программы
Здравствуйте! Помогите пожалуйста решить задачку. 1) Итерацию, процесс вывода сделать в отдельном...

Блок-схема для данной программы
Помоги составить блок схему для данной программы. Program Zadacha; uses crt; var ...

6
15110 / 8110 / 1958
Регистрация: 30.01.2014
Сообщений: 13,784
06.05.2017, 00:08 2
DrKochev, Это нестандартная функция. Нужно, чтобы это где-то отложилось

Можно попробовать вот такой код. Естественно на OS X у меня возможности нет проверить, поэтому предоставляю сделать это автору темы.
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
#include <iostream>
#include <cstdio>
 
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
 
int getche() 
{
    struct termios oldt, newt;
    int  ch;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = std::getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    std::putchar(ch);
    return ch;
}
 
int main()
{
    using namespace std;
    
    int chcount = 0;
    int wdcount = 1;
    char ch='a';
    cout << "Введите строку:";
    while(ch != '\r')
    {
        ch = getche();
        if(ch == ' ')
            wdcount++;
        else
            chcount++;
    }
    cout << "\nСлов:" << wdcount << endl
         << "Букв:" << (chcount-1)<<endl;
    return 0;
}
0
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
06.05.2017, 00:59 3
Лучший ответ Сообщение было отмечено DrKochev как решение

Решение

Цитата Сообщение от DrKochev Посмотреть сообщение
чтобы дальше по учебнику заниматься
Что имеется в виду: чтобы код в main() остался тот же, или чтобы без getch(), но правильно работало?
Цитата Сообщение от DrKochev Посмотреть сообщение
Если заменить getche на getchar, то программа просто считывает данные, никак не реагирует. Т.е просто бесконечно можно вводить текст.
Если так:
C++
1
2
3
4
5
6
7
8
9
10
 
        while(ch != '\n')
        {
            ch = getchar();
            
            if(ch == ' ')
                wdcount++;
            else
                chcount++;
        }
C++
1
2
3
4
5
6
7
8
9
        while(ch != '\n')
        {
            ch = cin.get();
            
            if(ch == ' ')
                wdcount++;
            else
                chcount++;
        }
Добавлено через 8 минут
Не знаю, будет ли так (с '\n') работать на OSX, ведь там, насколько знаю, символ новой строки - '\r'. Тогда не понятно это:
Цитата Сообщение от DrKochev Посмотреть сообщение
Если заменить getche на getchar, то программа просто считывает данные, никак не реагирует. Т.е просто бесконечно можно вводить текст.
1
0 / 0 / 0
Регистрация: 05.05.2017
Сообщений: 2
06.05.2017, 07:22  [ТС] 4
Да, спасибо большое, n2! С вашим кодом программа работает корректно

Добавлено через 57 секунд
DrOffset, У меня этот код при вводе текста, дублирует каждую букву/пробел.
0
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
06.05.2017, 10:57 5
Цитата Сообщение от DrKochev Посмотреть сообщение
С вашим кодом программа работает корректно
Осталось с этим разобраться:
Цитата Сообщение от nd2 Посмотреть сообщение
Не знаю, будет ли так (с '\n') работать на OSX, ведь там, насколько знаю, символ новой строки - '\r'.
0
15110 / 8110 / 1958
Регистрация: 30.01.2014
Сообщений: 13,784
06.05.2017, 13:21 6
Цитата Сообщение от DrKochev Посмотреть сообщение
У меня этот код при вводе текста, дублирует каждую букву/пробел.
В таком случае надо удалить строку 18: std::putchar(ch);
0
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
06.05.2017, 13:59 7
Цитата Сообщение от nd2 Посмотреть сообщение
Осталось с этим разобраться:
Цитата Сообщение от nd2 Посмотреть сообщение
ведь там, насколько знаю, символ новой строки - '\r'.
Был в Mac OS до версии 9 и OS-9. В Mac OS X, так же как и в Linux: один символ '\n'.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2017, 13:59

составьте блок-схему для данной программы:
Var i,n,k,max: Integer; BEGIN Writeln('wwedite 10 chisel: '); k:=0; max:=-MaxInt; For i:=1...

составить блок схему для данной программы
uses crt; const n=5; var a:array of integer; i,j:byte; s:integer; begin clrscr;...

Нужно построить график для данной программы
Вообще не разбираюсь в графиках, нам такого не преподавали, но требуют сделать. Вот УСЛОВИЕ задачи...

Visual Basic для Mac OSX
Собственно сабж. Существует ли данная среда для Mac OSX. Если да, то помогите достать, а то уже...


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

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

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