Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Apelsin199
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
1

Функция неправильно сравнивает содержимое файла и элемента структуры

04.01.2013, 12:31. Просмотров 929. Ответов 4
Метки нет (Все метки)

Вот такая ситуация... Есть клочек кода:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <locale.h>
#include <vector>
#include <conio.h>
using namespace std;
 
struct user
{
    char login[22], password[22];
    int status;
};
 
bool proverca ()
{
    user s;
    FILE *p;
    int n;
    char pas[21];
    p=fopen("pasford.txt","r+b");
    while(!feof(p))
    {
        fscanf(p,"%s", &pas);
        if(strcmpi(pas,s.password))
            return true;
        else
            return false;
    }
}
 
bool UsersMatch(user A, user B)
{
    if (strstr(A.login,B.login) && strstr(A.password,B.password))
        return 1;
    return 0;
}
 
void setText (char *str, int size)
{
    int i = 0;
    char ch;
    do
    {
        scanf("%c",&ch);
        str[i] = ch;
        i++;
        if (str[0] == 10)
        {
            printf("Нельзя вводить пустую строку! Повторите ввод...\n");
            i=0;
        }
        else 
            if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == 10)
            {
                if(i == size-1)
                {
                    do
                    {
                        scanf("%c",&ch);
                    }
                    while (ch != 10);
                    printf("Слишком длинная строка, пожалуйста, введите строку заново:\n");
                    i = 0;
                }
            }
            else
            {
                printf("Ведены недопустимые знаки, доступны лишь буквы латинского алфавита и цифры\n");
                do
                {
                    scanf("%c",&ch);
                }
                while (ch != 10);
                i = 0;
            }
    }
    while ((i == 0 || ch != 10) && i < size-1);
    str[i-1] = '\0';
    return;
}
 
const char ENTER = 13;
const char BACKSPACE = 8;
 
int main()
{
    setlocale(LC_ALL,"rus");
    user us;
    int i = 0;
    bool fl;
    fl=0;
    printf("Введите логин: ");
    setText(us.login, 20);
    printf("Введите пороль: ");
    char ch;
    do
    {
        while((ch = _getch()) != ENTER)
        {
            if (i < 21)
            {
                fl = 0;
                us.password[i]= ch;
            }
            else
                fl = 1;
            if (ch == BACKSPACE && i > 0)
            {
                i--;
                cout << "\b" << " " << "\b";
            }
            else if (ch != BACKSPACE)
            {
                i++;
                cout << '*';
            }
        }
        if (fl)
        {
            fl = 0;
            i = 0;
            cout << endl << "Неверный пороль. Пожалуйста повторите ввод: ";
        } 
        else 
            if (i == 0)
            {
                cout << endl << "Пароль не может быть пустым" << endl << "Пожалуйста, повторите ввод: ";
            }
    }
    while(!i);
    us.password[i] = '\0';
    if(proverca())
        printf("\nBсе хорошо...");
    else
        printf("\nBсе плохо...");
    getch();
    return 0;
}
Проблема состоит в том, что в main в структуру user переменную password всё записывается адекватно, записываю в этом клочке:
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
    printf("Введите пороль: ");
    char ch;
    do
    {
        while((ch = _getch()) != ENTER)
        {
            if (i < 21)
            {
                fl = 0;
                us.password[i]= ch;
            }
            else
                fl = 1;
            if (ch == BACKSPACE && i > 0)
            {
                i--;
                cout << "\b" << " " << "\b";
            }
            else if (ch != BACKSPACE)
            {
                i++;
                cout << '*';
            }
        }
        if (fl)
        {
            fl = 0;
            i = 0;
            cout << endl << "Неверный пороль. Пожалуйста повторите ввод: ";
        } 
        else 
            if (i == 0)
            {
                cout << endl << "Пароль не может быть пустым" << endl << "Пожалуйста, повторите ввод: ";
            }
    }
Но, когда я вызываю функцию proverca, она всегда возвращает значение true и к тому же нифига не читает то, что я записал в password... в функции proverca я считываю инфу из файла и сравниваю с тем, что я ввёл... как правильно написать функцию? Где я жестко ошибся?...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2013, 12:31
Ответы с готовыми решениями:

Неправильно сравнивает
Нужно проверить , что цвет не КРАСНЫЙ.НО при ТРАССИРОВКЕ выводит что цвет...

Неправильно сравнивает строки wchar_t* и std::wstring
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;cstdlib&gt;...

Удаление элемента структуры из файла
Хочу сделать подобие телефонного справочника, чтобы были функции создания базы...

Какая функция сравнивает строку s2 со строкой s1?
Какая функция сравнивает строку s2 со строкой s1?

Функция которая сравнивает текущую дату с заданной
У меня есть функция для получения текущей даты, но я не знаю как записать,...

4
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,380
04.01.2013, 12:39 2
Собственно, что за ерунда просходит в функции со страшным названием proverca? Создается новая структура, поля которой никак не инициализированы и происходит попытка сравнения с тем, что считано из файла.
1
Apelsin199
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
04.01.2013, 13:34  [ТС] 3
И как быть? как должна выглядить функция?
P.S.
И согласен... название страшное =)
0
zss
Модератор
Эксперт С++
7261 / 6705 / 4245
Регистрация: 18.12.2011
Сообщений: 17,705
Завершенные тесты: 1
04.01.2013, 13:38 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool proverca ( user s)
{
    FILE *p;
    int n;
    char pas[21];
    p=fopen("pasford.txt","r+b");
    while(!feof(p))
    {
        fscanf(p,"%s", &pas);
        if(strcmpi(pas,s.password))
            return true;
        else
            return false;
    }
}
и соответственно вызов
C++
1
if(proverca(us))
1
Apelsin199
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
04.01.2013, 13:41  [ТС] 5
Спасибо, всё работает =)
0
04.01.2013, 13:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2013, 13:41

Удаление элемента структуры для правильного считывания WAV-файла
Господа, возник такой вопрос: Мне необходимо удалить элемент структуры. Это...

Функция сравнивает две строки, игнорируя различия в регистрах
Я студент 1 курса на зачёт сказали написать программку помогите!! не хочу...

Сравнивает ли значения функция srtcmp, если они введены русскими буквами?
Сравнивает ли значения функция srtcmp,если они введены русскими буквами?


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

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

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