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

Gets не коректно работает

01.05.2014, 11:45. Просмотров 892. Ответов 10
Метки нет (Все метки)

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";
    //}
}
как я понял из интернета - это связано с ее переполнением. чем можно заменить.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2014, 11:45
Ответы с готовыми решениями:

Проверить коректно ли работает программа
Задание: Задание: написать программу, реализующую следующие задания, и...

Запись в бинарный файл работает не коректно, где ошибка?
Здравствуйте, делаю лабораторную работу, запись структуры Students в бинарный...

Не могу заставить функцию str.c_str() коректно работать
Доброго времени суток , мне нужно написать программу которая сравнивает...

1С 7,7 не работает коректно
Всем здрав, столкнулся с проблемой, 1С 7,7 работает только на 1 из компов....

JS не коректно работает
Привет! Помогите!!!!! Проблема такова. Разробатывал сайт на своем компе....

10
IrineK
Заблокирован
01.05.2014, 12:00 2
Лучший ответ Сообщение было отмечено Dmitrii-86 как решение

Решение

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';
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.05.2014, 12:30 3
Dmitrii-86, проблема конечно в переполнении. Просите вводить 4-значные числа, а под буфер выделяете 3 байта (к тому же один из них уйдет на завершающий ноль). Для начала нужно увеличить размер буфера, а дополнительно еще добавить проверку, т.е. избавиться от gets в пользу fgets.
P.s. Для выяснения кол-ва совпадающих цифр достаточного одного цикла.
1
Dmitrii-86
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 5
01.05.2014, 15:01  [ТС] 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);
            }
        }
    }
}
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.05.2014, 15:01 5
Dmitrii-86, почему при размере буфера 32 в fgets передаете 128? Это неверно. Должно быть тоже 32. Лучше вообще для этих целей завести константу и использовать ее как при определении массива, так и при вызове fgets.
0
IrineK
Заблокирован
01.05.2014, 15:08 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;
}
1
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.05.2014, 15:13 7
Для выяснения является ли символ цифрой есть стандартная функция isdigit

Добавлено через 4 минуты
IrineK, зачем же столько копипасты? Вывод на консоль зачем-то в функцию проверки включили.
0
IrineK
Заблокирован
01.05.2014, 15:24 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;
}
0
Dmitrii-86
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 5
01.05.2014, 15:34  [ТС] 9
спасибо, все работает, только надо было подключить файлы
#include<cstdio>
#include "string.h"
0
IrineK
Заблокирован
01.05.2014, 15:45 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,
последний вариант - самый благородный. Берите его.

Ну, а задачу - уже сами решите)
1
Dmitrii-86
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 5
01.05.2014, 15:57  [ТС] 11
IrineK, спасибо!!!)
0
01.05.2014, 15:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2014, 15:57

Не коректно работает домен
Добрый день.у меня вот такая вот проблема,прикрепил домен к сайту , а он у меня...

Не коректно работает mmcontrol
Помогите, на моем компе перестал работать mmcontrol.(на форму добавляется этот...

Не коректно работает терминальный сервер
На сервере добавили винт акрониксом перенесли на него систему. На следующий...


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

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

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