Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255

Баг strcmp

27.11.2010, 18:57. Показов 3085. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Линк на архив с видео, где записана ошибка.
http://upload.com.ua/get/902136351/Bug.zip
Пароль: bug
Объясните ситуацию.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.11.2010, 18:57
Ответы с готовыми решениями:

std::regex : баг на сайте или баг компилятора?
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает throw... Добавлено через 35 секунд компилятор gcc 4.8

Баг asio? или баг TCP стека?
всем привет. повстречался с очень странным багом. и не могу определить кто бажит, asio, или TCP-стек. на стороне клиента,...

strcmp
Вот изучаю С++, тут столкнулся с простой проблеммой, функция strcmp,которая проверяет на равенство 2 строки между собою. Попробывал...

33
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
27.11.2010, 19:23
Неужели нельзя залить на файлообменник, где не надо ждать минуту со всякой рекламой?
X больше, чем O, возвращается любое положительное число, не обязательно единица. А там проверка на true.
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 19:29  [ТС]
Цитата Сообщение от Somebody Посмотреть сообщение
Неужели нельзя залить на файлообменник, где не надо ждать минуту со всякой рекламой?
X больше, чем O, возвращается любое положительное число, не обязательно единица. А там проверка на true.
на true та же ситуация
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.11.2010, 19:34
alexsvk, за такую тему забанить мало
оформляйте тему нормально
0
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 5
27.11.2010, 19:43
запомните у стандартных функций нет багов
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.11.2010, 19:47
А ТС знает, что strcmp возвращает ноль, если две строки равны, т.е. значение, которое в остальных случаях интерпретируется как ложь?
Кстати, а что мешает выложить тот участок кода, где был замечен "баг", вместо того, чтобы мучаться с записью видео/выкладыванием его на файлообменник и заставлять мучаться других при его скачивании?

Не по теме:

А еще багов в стандартной библиотеке не заметил? А то интересно было бы послушать...

0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.11.2010, 19:58
Я заметил - log(-1) неправильно считает.

Добавлено через 1 минуту
И ещё sqrt(x) == x при x = 1 почему-то...
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.11.2010, 20:04
Цитата Сообщение от silent_1991 Посмотреть сообщение
Я заметил - log(-1) неправильно считает
да, беда-то какая А как должно быть правильно?
Цитата Сообщение от silent_1991 Посмотреть сообщение
И ещё sqrt(x) == x при x = 1 почему-то...
а у меня выводит единицу

Не по теме:

Кстати, asin(x) для |x|>1 только у меня не работает?

0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 20:12  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    char str[2] = "";
    char s [2];
 
    s [0] = who;
    s [1] = '\0';
 
    for(int i = 0; i < 30; i++)
    {
        for (int j = 0; j < 63; j++)
        {
            getCellValue(i,j,str);
 
            if (strcmp(str,s) == true)
            {
                setCellValue(i,j,(char*)s);
            }
        }
    }
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.11.2010, 20:15
alexsvk, а теперь скажи, какие значения аргументов у функции strcmp в момент "бага" и какой результат ты от нее ожидаешь (str равна s, str больше s, str меньше s)? Судя по твоему коду, setCellValue должно срабатывать, когда str больше, чем s. Я прав?
И да, какой смысл кастовать s к типу char*?
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 20:20  [ТС]
Цитата Сообщение от Nameless One Посмотреть сообщение
alexsvk, а теперь скажи, какие значения аргументов у функции strcmp в момент "бага" и какой результат ты от нее ожидаешь (str равна s, str больше s, str меньше s)?
И да, какой смысл кастовать s к типу char*?
Debug:
s[0] = 'X';
s [1] = 'O';

А смысл в том, что мне нужно SendMessage(...,WM_SETTEXT,...,...) реализовывать, где последний параметр типа const char*. who типа char.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.11.2010, 20:29
Цитата Сообщение от alexsvk Посмотреть сообщение
Debug:
s[0] = 'X';
s [1] = 'O';
а теперь вопрос на засыпку: сколько ты символов выделил для массива s? Два, правильно? А в твоем массиве где-нибудь есть символ '\0'? А с какими строками работает функция strcmp? Правильно, с теми, которые заканчиваются на '\0', т.е. с null-terminated strings. А ты передал в функцию strcmp просто массив символов, в котором нет символа '\0', т.е. признака конца строки, и после этого ожидаешь, что функция будет работать правильно?
Цитата Сообщение от alexsvk Посмотреть сообщение
А смысл в том, что мне нужно SendMessage(...,WM_SETTEXT,...,...) реализовывать, где последний параметр типа const char*. who типа char.
who может быть и типа char, но в функцию setCellValue ты передаешь не who, а s, у которой и так уже тип char*. Т.е. ты кастуешь переменную с типом char* к типу char*. Лично мне это кажется бессмысленным
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 20:37  [ТС]
Цитата Сообщение от Nameless One Посмотреть сообщение
а теперь вопрос на засыпку: сколько ты символов выделил для массива s? Два, правильно? А в твоем массиве где-нибудь есть символ '\0'? А с какими строками работает функция strcmp? Правильно, с теми, которые заканчиваются на '\0', т.е. с null-terminated strings. А ты передал в функцию strcmp просто массив символов, в котором нет символа '\0', т.е. признака конца строки, и после этого ожидаешь, что функция будет работать правильно?

who может быть и типа char, но в функцию setCellValue ты передаешь не who, а s, у которой и так уже тип char*. Т.е. ты кастуешь переменную с типом char* к типу char*. Лично мне это кажется бессмысленным

Не по теме:

Прошу прощения, что за бред.


Посмотрите ещё раз код, пожалуйста, там s[1] = '\0';
Да, и ещё. Если у Вас есть лучший вариант преобразования параметра с буквой к char*, то скажите как. Буду благодарен.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.11.2010, 20:41
Цитата Сообщение от alexsvk Посмотреть сообщение

Не по теме:

Прошу прощения, что за бред.


Посмотрите ещё раз код, пожалуйста, там s[1] = '\0';

Не по теме:

О да, бред...


Какая разница, какое значение s[1] имело при первичной инициализации? В интересующий нас момент какое значение у s[1] нам показывает отладчик? 'O', а 'O' != '\0'
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
27.11.2010, 20:44  [ТС]
Цитата Сообщение от Nameless One Посмотреть сообщение

Не по теме:

О да, бред...


Какая разница, какое значение s[1] имело при первичной инициализации? В интересующий нас момент какое значение у s[1] нам показывает отладчик? 'O', а 'O' != '\0'
тьфу.. прошу прощения, там s[0] = 'O'; - т.е. проблема остаётся
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.11.2010, 20:49
Кстати, непонятно, как могло измениться значение s[1], которое вроде было равно '\0', если с момента начальной инициализации оно не менялось (вроде бы)? Если только функция setCellValue модифицирует значение s... Если это твоя функция, попробуй изменить тип параметра с char* на const char*.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.11.2010, 21:54
Цитата Сообщение от Nameless One
А как должно быть правильно?
Это уже другой вопрос

Цитата Сообщение от Nameless One
а у меня выводит единицу
Я на то и сетовал
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
28.11.2010, 01:05
Цитата Сообщение от silent_1991 Посмотреть сообщение
Я заметил - log(-1) неправильно считает.

Добавлено через 1 минуту
И ещё sqrt(x) == x при x = 1 почему-то...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <math.h>
#include <errno.h>
 
int main(void)
{
    double n = log(-1);
    
    printf("%f" "\n", n);
    
    if (errno)
        perror("math");
    
    printf("%d" "\n", sqrt(1.0) == 1.0);
        
    return 0;
}
Code
1
2
3
4
5
[guest@localhost tests]$ ./t
nan
math: Numerical argument out of domain
1
[guest@localhost tests]$
C89
4.5.1 Treatment of error conditions

The behavior of each of these functions is defined for all
representable values of its input arguments. Each function shall
execute as if it were a single operation, without generating any
externally visible exceptions.

For all functions, a domain error occurs if an input argument is
outside the domain over which the mathematical function is defined.
The description of each function lists any required domain errors; an
implementation may define additional domain errors, provided that such
errors are consistent with the mathematical definition of the
function./94/ On a domain error, the function returns an
implementation-defined value; the value of the macro EDOM is stored in
errno .

Similarly, a range error occurs if the result of the function
cannot be represented as a double value. If the result overflows (the
magnitude of the result is so large that it cannot be represented in
an object of the specified type), the function returns the value of
the macro HUGE_VAL , with the same sign as the correct value of the
function; the value of the macro ERANGE is stored in errno . If the
result underflows (the magnitude of the result is so small that it
cannot be represented in an object of the specified type), the
function returns zero; whether the integer expression errno acquires
the value of the macro ERANGE is implementation-defined.
Добавлено через 4 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение

Не по теме:

Кстати, asin(x) для |x|>1 только у меня не работает?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <math.h>
#include <errno.h>
 
int main(void)
{
    double n = asin(2);
    
    printf("%f" "\n", n);
    
    if (errno)
        perror("math");
    
    return 0;
}
Code
1
2
3
4
[guest@localhost tests]$ ./t
nan
math: Numerical argument out of domain
[guest@localhost tests]$
0
28.11.2010, 01:07

Не по теме:

accept, если что, это всё был сарказм)))

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.11.2010, 01:19
Гм. Для снятия константности лучше использовать const_cast<char*> но т.к. тут нету константности, то смысла в использовании нет. Да и потом. ТС, ты может все таки объяснишь, что ты хочешь получить от сравнения строк?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.11.2010, 01:19
Помогаю со студенческими работами здесь

strcmp()
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cstring&gt; using namespace std; int main() { ...

strcmp
Не могу понять, как правильно прировнять два слова. КОгда компилирую и ввожу слово, програма самостаятельно закрываеться, точне...

STRCMP
Как работает функция strcmp? strncmp? while(L&lt;R) { m=(L+R)/2; ...

strcmp
slovo={'d','d','d'}; char *slovo2=new char; for(int i=0;i&lt;k;i++) { cin&gt;&gt;slovo2; } int s=strcmp(slovo2,slovo); и ввожу...

Strcmp
Пользуюсь Visual Studio 2013. Читай книжку, выполняю примеры. Там есть пример с использованием strcmp и сказано подключить &lt;cstring&gt;....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru