0 / 1 / 0
Регистрация: 30.08.2015
Сообщений: 34
1

Проблема с isdigit() в условии

01.02.2019, 01:47. Показов 1166. Ответов 4

Подскажите кто знает!
В 72 строке ,в условии где isdigit использую 2 раза через ||(или) если ввожу букву и число ,то букву возвращает нулём , если введу 2 буквы тогда отрабатывает будто стоит &&(и) ,выводит сообщение об ошибке как и задумано
В чем моя ошибка, кто знает?

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
//Laba 7.Вариант 30 Функция выделяет из заданной строки подстроку заданной длины, начиная с заданной позиции.
 
#include <iostream>
#include <cctype>   // для функции isdigit
#include <cstdlib>  // для функции atoi
 
using namespace std;
 
char* stroka(char* temp, int positia, int dlina) {
 
    int size = dlina - positia+1;
    char* z = new char[size];
    int k = 0;
 
    for (int i = positia; i < dlina; i++) {
        z[k] = temp[i];
        k++;
    }
    z[k] = '\0';
 
    cout << size << endl;
 
    return z;
}
 
 
int mylen(char str[], int n) {
 
    int i = 0;
    int k = 0;
 
    while (str[i]) {
 
        if (str[i] != '\0') {
            k++;
        }
        i++;
    }
 
 
 
    return k;
}
 
 
int main() {
 
    setlocale(LC_ALL, "Rus");
 
 
    char a[500];
    
    cout << "Введите строку: ";
    cin.getline(a, 500);
 
    int k = mylen(a, 500);
    
    int len_substring, number_substring;
    char number[80], len[80];
 
    cout << "Введите номер элемента начала подстроки: ";
    cin >> number;
 
    cout << "Укажите длину подстроки. ";
    cin >> len;
 
    char* str;
    
 
 
 
    if (isdigit(number[0])||isdigit(len[0])) {
            
        number_substring = atoi(number);
        len_substring = atoi(len);
        
        cout << number_substring << len_substring << endl;
 
        if (number_substring <= k || len_substring <= k || 0 <= number_substring || 0 <= len_substring || len_substring > number_substring) {
 
            str = stroka(a, number_substring, len_substring);
            cout << str << endl;
 
            delete str;
        }
        else {
 
            cout << "Введенные значения выходят за пределы строки!\n";
 
        }
    }
    else {
        
        cout << "Введены неверные значения!" << endl;
 
    }
    
 
 
 
    system("pause");
    
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2019, 01:47
Ответы с готовыми решениями:

Проблема в условии
Ребят, непонимаю что делаю не так: программа ругается на условии if (Timer1-&gt;Enabled=true)...

Проблема в условии функции
Добрый день! У меня есть небольшая программа, в одном из условий которой какая-то проблема....

Проблема со строками в условии
Моя проблема в том, что программа отказывается входить условие. У меня есть строка, содержащая...

Переименовывание файлов при условии. Проблема длинных путей
всем доброго дня! Я тут решил начать изучать Powershell и начал с написания скрипта для...

4
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
01.02.2019, 02:17 2
Вы неправильно условие сконструировали. Надо
C++
1
if (isdigit(number[0]) && isdigit(len[0]))
если и number[0] это цифра, и len[0] это цифра, тогда выполнять блок.
1
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
01.02.2019, 02:50 3
SokolovVolody, в чем смысл вводить числа как строки и затем эти строки переводить в числа? Допустим, будет введено 1qwerty. Это правильное значение? Ваша программа считает, что правильное.

Функция mylen тоже как-то дико реализована.

Добавлено через 20 минут
Если все же очень хочется вводить именно строкой, то напрашивается такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool isNumber(const char *str) {
    for (size_t pos = 0; str[pos]; ++pos) {
        if (!isdigit(str[pos])) {
            return false;
        }
    }
 
    return true;
}
 
//...
 
if (isNumber(number) && isNumber(len)) {
    //...
}
else {
    cout << "Введены неверные значения!" << endl;
}
1
0 / 1 / 0
Регистрация: 30.08.2015
Сообщений: 34
01.02.2019, 13:54  [ТС] 4
valen10 , считываю строку потому что isdigit принимает символьные значения , если вводить целочисленные , то все что не входит в интервал 48-55, будет ложно. поэтому считывается строка , а потом преобразуется в инт.

Добавлено через 2 часа 52 минуты
Вопрос ещё один , в 84 строке у меня освобождение динамической памяти , в нужном ли месте оно у меня . До этого
Я очищал память перед строкой с return 0; , но мвс ругается и программа не работает .как сделать лучше?
0
Параллельный Кот
1904 / 826 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
01.02.2019, 14:19 5
Цитата Сообщение от SokolovVolody Посмотреть сообщение
как сделать лучше?
Лучше конечно писать char* str = nullptr;, тогда можно будет освобождать память и перед return 0;. Ваш вариант тоже рабочий, но вероятность ошибиться выше.

Добавлено через 6 минут
Цитата Сообщение от SokolovVolody Посмотреть сообщение
если вводить целочисленные , то все что не входит в интервал 48-55, будет ложно
Логично, вы сами объяснили, почему. Защиту от дурака обычно делают проверкой состояния потока ввода. Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <limits>
 
int getNumber(std::string prompt) {
    std::cout << prompt;
    int value;
 
    while(!(std::cin >> value)) {
        std::cerr << "Ошибка ввода, повторите попытку." << std::endl;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>().max(), '\n');
        std::cout << prompt;
    }
 
    return value;
}
 
int main() {
    int number_substring = getNumber("Введите номер элемента начала подстроки: ");
    int len_substring = getNumber("Укажите длину подстроки: ");
    //...
    return 0;
}
Правда если ввести 1q 2, то буква будет отнесена ко второму значению (число считывается как последовательность цифр до первого нецифрового символа) и ошибка будет напечатана соответственно для второго значения. Тут уже выбирайте, что больше подходит.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2019, 14:19
Помогаю со студенческими работами здесь

Как найти для этих условии 2 парных чисел а и b при котором выполняется все условии?
Мой пример кода был таким данный момент но не работал. В экране пустота. Ничего не выводится. Где у...

isdigit
Возник вопрос по фукции isdigit в описании написано int isdigit(int c); и выходит что в...

isdigit()
Здравствуйте. Почему не работает isdigit() в этом примере? Пробовал разные варианты. Задача в том...

isdigit() и кириллица
При этом коде если ввести символ из кириллицы выдаст ошибку. Как от неё избавиться? int main()...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru