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

Gets не коректно работает - C++

Восстановить пароль Регистрация
 
Dmitrii-86
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 5
01.05.2014, 11:45     Gets не коректно работает #1
gets не коректно работает в следующем коде

смысл программы в 2-ух 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
#include<iostream>
#include<cstdio>
using namespace std;
 
 
int main(void)
{
    char in[3], etalon[3]; 
    int b,k;
 
    cout << "Введите 4 значное число: ";
    gets(etalon);
    cout << etalon; //просмотр значения переменной etalon
    //while (in != "exit")
    //{
        b=0; k=0;
        cout << "Введите число для сравнения:";
        gets(in);
        cout << etalon; // просмотр значения переменной etalon
        //cout << in << etalon << endl;
        for (int i=0; i<=3; i++)
        {
            for (int j=0; j<=3; j++)
            {
                //cout << k++<<endl << in[i]<<endl << etalon[j] <<endl << in<<endl << etalon<<endl;
                if (in[i] == etalon[j] && i==j)
                {
                    b++;
                    break;
                }
            }
        }
        cout << "Результат >> " << b << " \n";
    //}
}
как я понял из интернета - это связано с ее переполнением. чем можно заменить.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
01.05.2014, 12:00     Gets не коректно работает #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
char buf[SIZE];
 
fgets (buf, SIZE, stdin);
if (buf[strlen(buf)-1] == '\n') //убираем '\n'
    buf[strlen(buf)-1] = '\0';
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.05.2014, 12:30     Gets не коректно работает #3
Dmitrii-86, проблема конечно в переполнении. Просите вводить 4-значные числа, а под буфер выделяете 3 байта (к тому же один из них уйдет на завершающий ноль). Для начала нужно увеличить размер буфера, а дополнительно еще добавить проверку, т.е. избавиться от gets в пользу fgets.
P.s. Для выяснения кол-ва совпадающих цифр достаточного одного цикла.
Dmitrii-86
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 5
01.05.2014, 15:01  [ТС]     Gets не коректно работает #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
#include<iostream>
#include<cstdio>
#include "string.h"
using namespace std;
 
int bik(char in[32], char etalon[32]);
int kor(char in[32], char etalon[32]);
 
int main(void)
{
    char in[32], etalon[32];
    int b,k;
 
    //передает строку из консоли в переменную etalon
    for (;;)
    {
        cout << "Введите 4 значное число: ";
        fgets (etalon, 32, stdin);
        if (etalon[strlen(etalon)-1] == '\n') //убираем '\n'
            etalon[strlen(etalon)-1] = '\0';
        if (strlen(etalon)==4) break;
            else cout << "Вы ввели не коректное число!!!" <<endl;
    }
    
        
        
            b=0; k=0;
            for (;;)
            {
                cout << "Введите число для сравнения:";
                fgets (in, 32, stdin);      
                if (in[strlen(in)-1] == '\n') //убираем '\n'
                    in[strlen(in)-1] = '\0';
                if (strlen(in)==4) break;
                    else cout << "Вы ввели не коректное число!!!" <<endl;   
            }
            b = bik (in, etalon);
            k = kor (in, etalon);
            cout << "Результат >> " << b << " и " << k << " \n";
        
        
}
 
int bik (char in[32], char etalon[32])
{
    int b=0;
    for (int i=0; i<=3; i++)
                {
                    if (in[i] == etalon[i]) b++;
                }
    return(b);
}
 
int kor (char in[32], char etalon[32])
{
    int k=0;
    for (int i=0; i<=3; i++)
    {
        for (int j=0; j<=3; j++)
        {
            if (in[i] == etalon[j] && i!=j)
                {
                    k++;
                    break;
                }
        }
    }
    return(k);
}
Только теперь возник следующий вопрос: как ограничить ввод таким образом, чтобы вводились только цифры и они в строке не повторялись? Важнее первый вопрос.

Добавлено через 29 минут
Как-то можно сделать, чтобы символ сравнивался с последовательностью символов. Что-то вроди
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int corect(char in_str[32])
{
    char etalon_str [9];
    etalon_str='1','2','3','4','5','6','7','8','9','0'; // на этой строке выдает ошибку
    for (int i=0; i<=3; i++)
    {
        for (int j=0; j<=9; j++)
        {
            if (in_str[i]!=etalon_str[j])
            {
                return(1);
            }
        }
    }
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.05.2014, 15:01     Gets не коректно работает #5
Dmitrii-86, почему при размере буфера 32 в fgets передаете 128? Это неверно. Должно быть тоже 32. Лучше вообще для этих целей завести константу и использовать ее как при определении массива, так и при вызове fgets.
IrineK
Заблокирован
01.05.2014, 15:08     Gets не коректно работает #6
Проверка:

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
#include <iostream>
 
bool Check (char *s)
{   if (strlen(s) != 4)
    {   std::cout<< "4-digit number with unique digits expected. Try again\n\t";
        return false;
    }
    
    int i,j;
    for (i = 0; i<4; i++)
        if (s[i] < '0' || s[i] > '9')
        {   std::cout<< "4-digit number with unique digits expected. Try again\n\t";
            return false;
        }
 
    for (i = 0; i<3; i++)
        for (j = i+1; j<4; j++)
            if (s[i] == s[j])
            {   std::cout<< "4-digit number with unique digits expected. Try again\n\t";
                return false;
            }
    
    return true;
}
 
 
int main()
{   char s1[5], s2[5];
    bool right = false;
 
    std::cout << "First 4-digit number with unique digits:\n\t";
    while (!right)
    {   fgets (s1, 5, stdin);
        if (s1[strlen(s1)-1] == '\n') 
            s1[strlen(s1)-1] = '\0';
        right = Check(s1);
        fflush (stdin);
    }
    std::cout << "Your first number: " << s1 << "\n\n";
 
    right = false;
    std::cout << "Second 4-digit number with unique digits:\n\t";
    while (!right)
    {   fgets (s2, 5, stdin);
        if (s2[strlen(s2)-1] == '\n') 
            s2[strlen(s2)-1] = '\0';
        right = Check(s2);
        fflush (stdin);
    }
 
    std::cout << "Your second number: " << s2 << "\n\n";
 
     
    std::cin.get();
    return 0;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.05.2014, 15:13     Gets не коректно работает #7
Для выяснения является ли символ цифрой есть стандартная функция isdigit

Добавлено через 4 минуты
IrineK, зачем же столько копипасты? Вывод на консоль зачем-то в функцию проверки включили.
IrineK
Заблокирован
01.05.2014, 15:24     Gets не коректно работает #8
Цитата Сообщение от Tulosba Посмотреть сообщение
зачем же
Облагородьте - оценим )

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool Check (char *s)
{   if (strlen(s) != 4)
    {   std::cout<< "4-digit number expected. Try again\n\t";
        return false;
    }
    
    int i,j;
    for (i = 0; i<4; i++)
        if (s[i] < '0' || s[i] > '9')
        {   std::cout<< "Digits expected. Try again\n\t";
            return false;
        }
 
    for (i = 0; i<3; i++)
        for (j = i+1; j<4; j++)
            if (s[i] == s[j])
            {   std::cout<< "Unique digits expected. Try again\n\t";
                return false;
            }
    
    return true;
}
Dmitrii-86
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 5
01.05.2014, 15:34  [ТС]     Gets не коректно работает #9
спасибо, все работает, только надо было подключить файлы
#include<cstdio>
#include "string.h"
IrineK
Заблокирован
01.05.2014, 15:45     Gets не коректно работает #10
Облагораживаем дальше:

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
#include <iostream>
 
bool Check (char *s)
{   if (strlen(s) != 4)
    {   std::cout<< "4-digit number expected. Try again\n\t";
        return false;
    }
    
    int i,j;
    for (i = 0; i<4; i++)
        if (s[i] < '0' || s[i] > '9')
        {   std::cout<< "Digits expected. Try again\n\t";
            return false;
        }
 
    for (i = 0; i<3; i++)
        for (j = i+1; j<4; j++)
            if (s[i] == s[j])
            {   std::cout<< "Unique digits expected. Try again\n\t";
                return false;
            }
    
    return true;
}
 
void GetNumber (char *num)
{   char buf[BUFSIZ];
    bool right = false;
    while (!right)
    {   fgets (buf, BUFSIZ, stdin);
        if (buf[strlen(buf)-1] == '\n') 
            buf[strlen(buf)-1] = '\0';
        right = Check(buf);
        fflush (stdin);
    }
    strcpy(num, buf);
}
 
 
int main()
{   char s1[5] = "", s2[5] = "";
 
    std::cout << "First 4-digit number with unique digits:\n\t";
    GetNumber(s1);
    std::cout << "Your first number: " << s1 << "\n\n";
 
    std::cout << "Second 4-digit number with unique digits:\n\t";
    GetNumber(s2);
    std::cout << "Your second number: " << s2 << "\n\n";
     
    std::cin.get();
    return 0;
}
Добавлено через 3 минуты
Dmitrii-86,
последний вариант - самый благородный. Берите его.

Ну, а задачу - уже сами решите)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2014, 15:57     Gets не коректно работает
Еще ссылки по теме:

Русификация.Работает-супер! Обьяснитте, как это работает? C++
C++ setprecision() не работает, или работает не так как нужно
Multimap STL - работает только запись в файл, поиск в файле не работает C++

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

Или воспользуйтесь поиском по форуму:
Dmitrii-86
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 5
01.05.2014, 15:57  [ТС]     Gets не коректно работает #11
IrineK, спасибо!!!)
Yandex
Объявления
01.05.2014, 15:57     Gets не коректно работает
Ответ Создать тему
Опции темы

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