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

Почему не работает программа-пример для демонстрации работы функции strcmp (из книги Шилдта)?

27.01.2017, 18:26. Просмотров 1138. Ответов 7
Метки нет (Все метки)

Здравствуйте, помогите пожалуйста разобраться, почему программа не выполняется как надо. Программа-пример, для демонстрации работы функции strcmp(). По идее должна принимать данные до тех пор, пока не будет введено слово "выход" , но на практике она спрашивает данные и после введения слова. Хотя я не понимаю, почему она должна работать корректно, если условием выхода из бесконечного цикла является НЕсовпадение введенного слова со словом "выход".
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "rus");
    char s[80];
    for(;;) {
            cout<<"Введите строку: \n";
            gets(s);
            if(!strcmp("выход", s)) break;
            }
    return 0;
}
Если можно, буду очень благодарна и за разъяснение предыдущей программы из книги Шилдта:
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
#include <cstring>
#include <cstdio>
 
using namespace std;
 
bool password();
int main()
{
    setlocale(LC_CTYPE, "rus");
    if(password()) cout<<"Вход разрешен\n";
    else cout<<"В доступе отказано\n";
    system("pause");
    return 0;
}
//функция возвращает true если пароль принят и false в противном случае
 
bool password()
{
     char s[80];
     cout<<"Введите пароль: \n";
     gets(s); //функция gets() принимает строку, вводимую с клавиатуры с пробелами
     if(strcmp(s, "пароль")){ //строки различны
                              cout<<"Пароль недействителен\n";
                              return false;
                              }
                              return true;
}
В этой программе при вводе слова "пароль" пишет "в доступе отказано", я думаю потому, что функция strcmp() при совпадении строк возвращает 0 - а это false. И в итоге password() возвращает false - в доступе отказано.
Конечно скорее всего я чего то не понимаю, но не знаю чего именно. Подскажите пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2017, 18:26
Ответы с готовыми решениями:

Указатели на структуры. Программа-пример из книги Шилдта
Здравствуйте. Прошу проверить, правильно ли я поняла значение каждой строчки, т.к. в книге...

Synchronized. Не работает пример из книги Шилдта «Java. Полное руководство»
Я нашёл ошибку в книге Герберта Шилдта «Java. Полное руководство». Это не задача из книги. Это...

Не работает программа из книги Герберта Шилдта.
При вводе кода из вышеупомянутой книги, выдает 3 ошибки: 1) error C2440: '=' : cannot convert...

Не работает программа из книги Герберта Шилдта.
Подскажите и мне тоже из этой книги не работает программа. #include&lt;iostream&gt; #include&lt;cstdlib&gt;...

7
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
27.01.2017, 18:59 2
Лучший ответ Сообщение было отмечено Kamila11 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstdio>
#include <cstring>
#include <windows.h>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "rus");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char s[80];
    for(;;) {
            cout<<"Введите строку: \n";
            gets(s);
            if(!strcmp("выход", s)) break;
            }
    return 0;
}
Проблема в том, что кодировки не совпадают, а русские символы в разных кодировках имеют разные коды символов, отсюда и "неверное" сравнение у strcmp.
Я показал как на винде включить ввод/вывод в режиме Windows-1251.
На второй задаче ошибка та же самая.
1
С чаем беда...
Эксперт CЭксперт С++
7865 / 3793 / 1042
Регистрация: 18.10.2014
Сообщений: 8,056
27.01.2017, 19:10 3
Цитата Сообщение от Kamila11 Посмотреть сообщение
если условием выхода из бесконечного цикла является НЕсовпадение введенного слова со словом "выход".
Условие выхода у вас является !strcmp("выход", s) - а это условие совпадения введенного слова со словом "выход".

Кстати, именно по этой причине выражение данного условия через оператор ! - дурная практика. Оператор ! несет отрицательную коннотацию, а сравнение на совпадение - положительную. Выражение положительного по сути утверждения через отрицательный оператор - неудобочитаемо. Лучше писать strcmp("выход", s) == 0.
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
27.01.2017, 20:53  [ТС] 4
Проблема в том, что кодировки не совпадают, а русские символы в разных кодировках имеют разные коды символов, отсюда и "неверное" сравнение у strcmp.
Я показал как на винде включить ввод/вывод в режиме Windows-1251.
На второй задаче ошибка та же самая.
Да я тоже подозревала, что дело в этом, потому что несколько дней уже промучилась с этими кодировками, от отчаяния уже была готова перейти на линукс) спасибо вам большое!

Добавлено через 2 минуты
Условие выхода у вас является !strcmp("выход", s) - а это условие совпадения введенного слова со словом "выход".

Кстати, именно по этой причине выражение данного условия через оператор ! - дурная практика. Оператор ! несет отрицательную коннотацию, а сравнение на совпадение - положительную. Выражение положительного по сути утверждения через отрицательный оператор - неудобочитаемо. Лучше писать strcmp("выход", s) == 0.
Спасибо за пояснение, подробнее изучу методы работы с этой функцией.

Добавлено через 1 час 13 минут
MrGluck, я воспользовалась вашим советом как настроить кодировку, программа заработала как надо, но в консоли отображаются одни кракозябли. Из за этого несколько дней назад, когда я мучилась с кодировками, отказалась от этого способа, но если с ним работает программа, то конечно лучше так. Можно ли как то сделать так, чтобы в консоли отображались человеческие русские буквы?
0
69 / 69 / 35
Регистрация: 06.07.2016
Сообщений: 415
27.01.2017, 20:55 5
Цитата Сообщение от Kamila11 Посмотреть сообщение
я воспользовалась вашим советом как настроить кодировку, программа заработала как надо, но в консоли отображаются одни кракозябли. Из за этого несколько дней назад, когда я мучилась с кодировками, отказалась от этого способа, но если с ним работает программа, то конечно лучше так. Можно ли как то сделать так, чтобы в консоли отображались человеческие русские буквы?
А что мешает использовать человеческие английские буквы? Тогда бы и первоначальной проблемы не было.
Быть может,вам поможет это - Русские шрифты в консоли
0
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
27.01.2017, 21:20  [ТС] 6
Notoriously, да ничего не мешает) но русские буквы как то родней) по вашей ссылке некоторые способы у меня не работают, а некоторые пока слишком сложные для меня. пойду почитаю про линукс)
0
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
27.01.2017, 22:17 7
Цитата Сообщение от Kamila11 Посмотреть сообщение
MrGluck, я воспользовалась вашим советом как настроить кодировку, программа заработала как надо, но в консоли отображаются одни кракозябли. Из за этого несколько дней назад, когда я мучилась с кодировками, отказалась от этого способа, но если с ним работает программа, то конечно лучше так. Можно ли как то сделать так, чтобы в консоли отображались человеческие русские буквы?
В свойствах консоли выбрать шрифт Lucida Console

Добавлено через 8 минут
Цитата Сообщение от Kamila11 Посмотреть сообщение
от отчаяния уже была готова перейти на линукс)
Так значит я сбил вас с пути истинного? Жаль(
0
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
28.01.2017, 14:27  [ТС] 8
MrGluck,
В свойствах консоли выбрать шрифт Lucida Console
у меня он и стоит, все равно не работает(
Так значит я сбил вас с пути истинного? Жаль(
не сбили)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2017, 14:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Объясните подробней пример из книги Шилдта
using System; class RangeArray { // Закрытые данные. int а; // ссылка на базовый массив int...

Пример из книги Шилдта. Интерфейсные свойства
Добрый вечер всем программистам. Почему при выполнении этого кода в режиме отладки выводятся совсем...

Не работает пример из книги. Почему?
... function load(){ myTag.load('Bad.xml') alert('Error:' + myTag.parserError.reason);}...

Программа для демонстрации работы побитовых операторов не компилируется
Добрый вечер всем! Я учусь программированию на С++. Написал небольшую программу из книжки....


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

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

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