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

strcmp не работает! - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
myslivec
 Аватар для myslivec
49 / 49 / 4
Регистрация: 08.04.2010
Сообщений: 261
30.10.2011, 21:02     strcmp не работает! #1
Ниже изложенная функция должна проверять не выходит ли за данный диапазон введенное число. Загвоздка вот в чем: strcmp сравнивает строки посимвольно, а у меня строка s почему то имеет значение первого символа. Что делать? Помогите пожалуйста!!!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool isRange(char* s) {
    char max[]="2147483647";
    char min[]="-2147483648"; // константы из ТЗ
    if (s[0]=='-') {
        int k=strcmp(s, min);
        if (k>0) {
            return false;
        }
        return true;
    }
    int k=strcmp(s, max);
    if (k>0) {
        return false;
    }
    return true;
 
}
strcmp не работает!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2011, 21:02     strcmp не работает!
Посмотрите здесь:

strcmp C++
C++ strcmp()
Не работает strcmp + указатели непойми что опять выводят C++
C++ STRCMP
C++ strcmp
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
30.10.2011, 21:49     strcmp не работает! #2
а обязательно хранить числа в виде строк? хотя бы функцию atoi можно использовать?
myslivec
 Аватар для myslivec
49 / 49 / 4
Регистрация: 08.04.2010
Сообщений: 261
30.10.2011, 21:57  [ТС]     strcmp не работает! #3
Смысл в том чтобы организовать корректный ввод. Обрабатывать все ошибки: выход за диапазон значений например. А если у число 9999999999999999999 как я проверю что оно входит в int, в данном случае и atoi выдаст либо ошибку либо некорректное значение. Так что сравнивать нужно в строках.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
30.10.2011, 22:28     strcmp не работает! #4
Цитата Сообщение от myslivec Посмотреть сообщение
а у меня строка s почему то имеет значение первого символа
если вы в дебаге видите только первый символ, это не значит что нет остальных

другое дело что вы сравниваете строки лексикографически, это не даст желаемого эффекта
например:
C
1
strcmp("48", "2147483647")
вернет значение > 0, потому как код символа '4' больше чем код символа '2'
myslivec
 Аватар для myslivec
49 / 49 / 4
Регистрация: 08.04.2010
Сообщений: 261
30.10.2011, 22:35  [ТС]     strcmp не работает! #5
Что делать?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
30.10.2011, 22:59     strcmp не работает! #6
Цитата Сообщение от myslivec Посмотреть сообщение
Что делать?
Ну если хотите проверить не выходит ли число за границы int'a, то можно написать так:
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdlib.h>
#include <limits.h>
 
int isinrange(char *s)
{
    double n = atof(s);
 
    if (n < (double) INT_MIN || n > (double) INT_MAX)
        return 0;
    return 1;
}
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
30.10.2011, 23:00     strcmp не работает! #7
Цитата Сообщение от myslivec Посмотреть сообщение
Что делать?
Сравнивать поэлементно. И не забудь про случай, когда два числа равны.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
31.10.2011, 22:57     strcmp не работает! #8
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
double n = atof(s);
я тебе введу 9e99999999999999999999999999999999999999999999999999999, не на трезвую конечно....

Добавлено через 10 минут
Цитата Сообщение от myslivec Посмотреть сообщение
Смысл в том чтобы организовать корректный ввод.
На мой взгляд с идея разумна с точки зрения обучения, если ты доберёшся до програмирования в графической среде, там это всё будет реализовано во встроенных классах. В таком контексте точное решение тебя интересовать не должно, вот тебе идеи:
1. В числе в начале может быть +/-/(0-9), далее произвольное число цифр, причём если их больше 16 (могу ошибиться) то их не получится записать даже в double. Есть решения и для таких случаев - гугли "класс чисел произвольной точности", когда изучишь классы... Далее может идти точка и дробная часть... Причём, у неё тоже есть определённые пределы, опять же, если речь идёт о встроенных типах. Ну и раз уж речь пошла о качественном вводе, потом ещё может быть 'e' а за ним экспоненциальный показатель, который, к счастью, должен быть целым (но не обязательно положительным).
2. Не обязательно использовать библиотечную strcmp... написать цикл вроде
C
1
2
3
4
5
6
7
8
9
int i;
for(i = 0; s[i]/*последний символ в строке - нулевой. Если это он, то s[i] равно нулю, то есть false.*/ && max[i]/*ведь за её пределы тоже нельзя выходить*/; ++i)
{
    if(s[i] > max[i])
        return false;
}
if(!max[i] && s[i])//т.е. если наша строка не закончилась а максимальная закончилась...
    return false;
return true;
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
31.10.2011, 22:59     strcmp не работает! #9
Если уж использовать функцию strcmp, то неплохо бы знать, что она возвращает:
The function compares successive elements from two strings, s1 and s2, until it finds elements that are not equal.

If all elements are equal, the function returns zero.
If the differing element from s1 is greater than the element from s2 (both taken as unsigned char), the function returns a positive number.
Otherwise, the function returns a negative number.
У тебя же идет проверка только
C++
1
if (k>0)
чего явно недостаточно...
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
31.10.2011, 23:04     strcmp не работает! #10
Цитата Сообщение от BRcr Посмотреть сообщение
if (k>0)
этого достаточно, ведь он установил, что число положительное! внимательнее читай код или точнее формулируй замечание! Другой вопрос, что в одном случае нужно k>0 а в другом k<0
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
31.10.2011, 23:15     strcmp не работает! #11
именно одна проверка на все случаи жизни - так не бывает...
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
31.10.2011, 23:51     strcmp не работает! #12
CEBEP, BRcr
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
#include <stdio.h>
 
int isinrange(char *s);
 
int main()
{
    char s[] = "9e99999999999999999999999999999999999999999999999999999";
 
    printf("%d\n", isinrange(s));
    printf("%d\n", isinrange("+2147483646"));
    return 0;
}
 
#include <stdlib.h>
#include <string.h>
#include <limits.h>
 
int count_digits(int);
 
int isinrange(char *s)
{
    char *min, *max, *p;
    int len_of_min = count_digits(INT_MIN);
    int len_of_max = count_digits(INT_MAX);
    int res;
    
    if (!(min = (char *) malloc(len_of_min + 2))
        || !(max = (char *) malloc(len_of_max + 1)))
        return 0;
    sprintf(min, "%d", INT_MIN);
    sprintf(max, "%d", INT_MAX);
    p = max;
    while (*s == ' ' || *s == '\t')
        s++;
    if (*s == '-')
        p = min;
    else if (*s == '+')
        s++;
    if (strlen(s) < strlen(p)) 
        res = 1;
    else if (strlen(s) > strlen(p))
        res = 0;
    else
        res = (((res = strcmp(s, p)) <= 0) ? 1 : 0);
    free(min);
    free(max);
    return res;
}
 
int count_digits(int n)
{
    int cnt = 0;
 
    do {
        cnt++;
    } while (n /= 10);
    return cnt;
}
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
31.10.2011, 23:56     strcmp не работает! #13
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
res = (((res = strcmp(s, p)) <= 0) ? 1 : 0);
а если strcmp в данном случае вернет отрицательное значение, каким в итоге окажется значение res?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
01.11.2011, 00:01     strcmp не работает! #14
Цитата Сообщение от BRcr Посмотреть сообщение
а если strcmp в данном случае вернет отрицательное значение, каким в итоге окажется значение res?
1

five letters
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2011, 00:29     strcmp не работает!
Еще ссылки по теме:

C++ Не работает strcmp
Strcmp C++
Неправильно работает функция strcmp c русскими буквами C++

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

Или воспользуйтесь поиском по форуму:
BRcr
01.11.2011, 00:29     strcmp не работает!
  #15

Не по теме:

Net_Wanderer, ну да, согласен, супер гут
никаких запарок с большими числами.

Yandex
Объявления
01.11.2011, 00:29     strcmp не работает!
Ответ Создать тему
Опции темы

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