1

Тема: Не працює strcmp в С++

Доброго часу доби!
Програма сприймає любий пароль, як правильний, а так не повинно бути. Заміна ввода/вивода на cin/get не допомагає. Допоможіть розібратися.

#include <stdio.h>
#include<iostream>
using std::cout;
using std::cin;
#define PASSWD            "+++\n"
#define MAX_LEN            1023

int check_user()
{
    char passwd[MAX_LEN];    

    fprintf(stderr,"enter password:");
    fgets(passwd, MAX_LEN,  stdin);
    return strcmp(passwd,PASSWD);
}


int my_func()
{
    if (check_user())
    {
        fprintf(stderr, "passwd ok\n");    
    }
    else
    {
        fprintf(stderr, "wrong passwd\n");
        exit(-1);
    }
    return 0;        
}

int main()
{

    my_func();
    return 0;
}

2 Востаннє редагувалося koala (22.07.2015 21:56:11)

Re: Не працює strcmp в С++

Перепрошую, дурню написав. Треба спати...

3

Re: Не працює strcmp в С++

koala, взагалі це не відповідь у даному випадку.

Для того, щоб працювало додати: #include<shlwapi.h>

4

Re: Не працює strcmp в С++

Краще правильно виставити локаль (setlocale). Хоча найкращий варіант - це той, який вас найбільше влаштовує.

5

Re: Не працює strcmp в С++

strcmp повертає 0 якщо порівнювані рядки ідентичні.
if (!check_user()) буде працювати правильно.

6

Re: Не працює strcmp в С++

Я краще так би зробив

bool check_user(){
    char passwd[MAX_LEN];    
     fprintf(stderr,"enter password:");
    fgets(passwd, MAX_LEN,  stdin);
    return strcmp(passwd,PASSWD) == 0;
}

7

Re: Не працює strcmp в С++

mich_retten,так не слід робити:

bool check_user(){
    char passwd[MAX_LEN];    
     fprintf(stderr,"enter password:");
    fgets(passwd, MAX_LEN,  stdin);
    return strcmp(passwd,PASSWD) == 0;

Цей код не раціональний.
1)strcmp повертає 0 або істина в залежності від результату порівняння. Тому == 0 тут зовсім не потрібно.
2)Цей код, якщо в компіляторі не вмикати оптимізацію, за розміром буде довшим, ніж той, що у самому першому пості. А при оптимізації, в залежності від компілятора, машинний код, скоріше за все не буде відрізнятися від машинного кода , що згенерується компілятором з вихідного кода першого поста.

8

Re: Не працює strcmp в С++

StillPhelix написав:

1)strcmp повертає 0 або істина в залежності від результату порівняння. Тому == 0 тут зовсім не потрібно.

Тоді ця функція має називатись not_check_user, а це звучить неприродньо. Та й взагалі якесь дивне зауваження. Навіть якщо так, то результатом виконання функції, що повертає bool, хочеться бачити логічне значення, а не число, хоча б через стійкість до помилок.

Подякували: Arete1

9 Востаннє редагувалося P.Y. (02.08.2015 22:52:05)

Re: Не працює strcmp в С++

1)strcmp повертає 0 або істина в залежності від результату порівняння. Тому == 0 тут зовсім не потрібно.

strcmp насправді повертає різницю кодів першої неоднакової пари символів порівнюваних рядків, або ж, якщо рядки однакові, 0. При цьому, 0 сприймається в мові С/С++ як хибність, будь-яке ненульове значення — як істина. Таким чином,
strcmp(s1,s2) сприйматиметься як істина, якщо рядки різні,
strcmp(s1,s2)==0 — якщо рядки однакові.
Відкинути ==0 — все одно, що інвертувати результат.

10

Re: Не працює strcmp в С++

1)strcmp повертає 0 або істина в залежності від результату порівняння. Тому == 0 тут зовсім не потрібно.
2)Цей код, якщо в компіляторі не вмикати оптимізацію, за розміром буде довшим, ніж той, що у самому першому пості. А при оптимізації, в залежності від компілятора, машинний код, скоріше за все не буде відрізнятися від машинного кода , що згенерується компілятором з вихідного кода першого поста.
Тому правильно буде так:

#include <stdio.h>
    #include<iostream>
    #include<shlwapi.h>
    #define PASSWD            "+++\n"
    #define MAX_LEN            1023
     
    int check_user()
    {
        char passwd[MAX_LEN];    
     
        fprintf(stderr,"enter password:");
        fgets(passwd, MAX_LEN,  stdin);
        return strcmp(passwd,PASSWD);
    }
     
     
    int my_func()
    {
        if (check_user())
        {
            fprintf(stderr, "wrong passwd\n");
            exit(-1);
        }
        else
        {
            fprintf(stderr, "passwd ok\n");
        }
        return 0;        
    }
     
    int main()
    {
     
        my_func();
        return 0;
    }

11

Re: Не працює strcmp в С++

За таке в продакшені

StillPhelix написав:
if (check_user())
        {
            fprintf(stderr, "wrong passwd\n");

зазвичай вбивають найповільнішим з доступних способів. Адекватнішою назвою буде tryLoginFailed, але коректно буде все ж поставити == 0.

Подякували: Arete1

12

Re: Не працює strcmp в С++

зазвичай вбивають найповільнішим з доступних способів. Адекватнішою назвою буде tryLoginFailed, але коректно буде все ж поставити == 0.

Якщо поставити == 0, то у даному випадку, компілятор вставить зайву строку кода в ехе-файл. Цей рядок буде займати зайву пам'ять, процесор буде витрачати зайві такти на обробку цієї зайвої команди.
От і виходить: зайва команда там, зайва команда сям і потім ми відчуваємо подив, від того, що програма гальмує та займає зайву пам'ять, глючить. В цій програмі вираз == 0 буде зайвим. Правильним рішенням буде скоригувати конструкцію if-else.

13

Re: Не працює strcmp в С++

:D  *BRAVO*

14

Re: Не працює strcmp в С++

quez, ви не смайлики розставляйте, а краще прочитайте уважно MSDN та вивчіть Ассемблер. Будь-яке логічне значення і є число. Не ображайте своїми діями учасників форуму.

15

Re: Не працює strcmp в С++

Навіть не знаю, про що ми з вами зараз будемо говорити. Можна про те, що порівняння з нулем — це дрібниці. Можна поговорити про те, що не варто підключати бібліотеки, коли вони не потрібні. Можемо про правильне іменування функцій. Можемо обговорити недосконалість системи типів в С++ і які проблеми вона собою несе. А ще є тема про те, як на смайлик БРАВО можна смертельно образитись. Обирайте, що вам до душі.

Подякували: koala, Arete2

16

Re: Не працює strcmp в С++

Гаразд, пане, ви зекономили аж два такти процесора і два байти інструкції на один вхід користувача в систему. Якщо припустити, що це мейнфрейм, яким користується мільйон людей на добу, економія вже складе 2 мільйони тактів на добу... але ті самі два байти інструкції.
А витратили ви, скажімо, разом 10 хвилин трьох різних програмістів цього мейнфрейму, які неправильно прочитали умову через невдалу назву, і, таким чином, 10 хвилин роботи цього мейнфрейму. Домашнє завдання - оцінити потужність системи, що приймає мільйон людей на добу, і за скільки часу економія тих двох тактів компенсує ті 10 хвилин. Це за умови, що через помилку в програмі хтось не зламав систему.
І ще раджу вам не розкидатися порадами, а вивчити математику і логіку. Числа і логічні значення - то різні речі, які просто представляються однаковими байтами в комп'ютері (щоправда, такими самими байтами ще малюнки і вірші в комп'ютері представлені - бо комп'ютер все представляє байтами). Ну і не плутайте MSDN зі стандартом, це неприпустимо і ображає учасників форуму.

Подякували: Arete1

17

Re: Не працює strcmp в С++

Ну і не плутайте MSDN зі стандартом, це неприпустимо і ображає учасників форуму

koala, расписывайтесь только за себя, а не за всех учасников форума даже если вы Replace Group. Ваша неприязнь к MSDN - ваши личные проблемы.
MSDN кстати облегчает жизнь программистам. В своё время, через суды программеры добивались того, что бы Мисрософт опубликовала техническую информацию о виндовс. Научитесь ценить чужие труды.

Вы можете дуться сколько угодно на меня, но от этого круг задач, для которых критичен размер и производительность никуда не денутся (это кстати не только вирусы). Учитесь мыслить шире.

Не вижу смысла в дальнейшей дискуссии.

18

Re: Не працює strcmp в С++

Я теж не бачу. Вчіть математику і не кип'ятіться.

19

Re: Не працює strcmp в С++

2StillPhelix
Друже, це не оптимізація, а якась лажа, ти намагаєшся приклеїти паперовий спойлер на трактор, в той час як в нього двухкорпусний плуг в землі.

З.І. Обережніше з москальською мовою, тут таке не люблять.

Подякували: Replace, koala2

20

Re: Не працює strcmp в С++

Я думав, він трохи тролює, а він справді близько до серця все сприймає.