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

printf sprintf не понятно - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
07.09.2013, 15:26     printf sprintf не понятно #1
Почему в printf строка отображается нормально, а sprintf вместо строки вставляет "(null)" ?

что нужно сделать со строкой что бы она нормально копировалась в sprintf?


char * какая-то строка полученная с бд

printf(строка) пишет "строка"

sprintf(... "строка: %s.", строка) получается "строка: (null)."
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2013, 15:26     printf sprintf не понятно
Посмотрите здесь:

C++ sprintf и %
c++ , sprintf() и Дух Плюсов C++
как i двигается понятно но вот не понятно как это делает j ? C++
Ошибка с sprintf в C++ Opengl C++
Чем ::printf предпочтительнее printf? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
07.09.2013, 17:50     printf sprintf не понятно #21
Цитата Сообщение от karaulov6 Посмотреть сообщение
extern char ** account_get_auth_mute_reason(t_account * account)
extern убери и посмотри что получится
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.09.2013, 17:51     printf sprintf не понятно #22
Кстати, ещё вопросы. У тебя программа однопоточная? Функция account_get_strattr реентерабельна?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
07.09.2013, 17:57     printf sprintf не понятно #23
нашел пример использования функции
C++
1
2
char const * user_quota;
 user_quota=account_get_strattr(user,"BNET\\auth\\mailquota");
так что прав Nameless One,
Цитата Сообщение от Nameless One Посмотреть сообщение
const char *msg = account_get_auth_mute_reason(acc);
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
07.09.2013, 18:09  [ТС]     printf sprintf не понятно #24
http://screenshot.su/show.php?img=c5...da7d71f680.jpg

возвращает указатель на строку с причиной, но не NULL.

Добавлено через 9 минут
А может быть это проблема с кодировкой? на сервере ANSI по моему (хотя скорее всего не из-за этого )
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.09.2013, 18:11     printf sprintf не понятно #25
karaulov6, по-моему, это heisenbug.

В результате отладочной сессии что вывелось? По-прежнему "(null)"?
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
07.09.2013, 18:13  [ТС]     printf sprintf не понятно #26
Цитата Сообщение от Nameless One Посмотреть сообщение
karaulov6, по-моему, это heisenbug.

В результате отладочной сессии что вывелось? По-прежнему "(null)"?
да, в отладчике причина написана, но в результате вместо причины (null)

что можно сделать со строкой ? скопировать куда-нибудь что бы потом проверить, или может еще что-нибудь?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.09.2013, 18:17     printf sprintf не понятно #27
karaulov6, хм, а простая строка в snprintf_s выводится? Типа:

C
1
snprintf_s(msg, msg_size, "%s", "test string");
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
07.09.2013, 18:20  [ТС]     printf sprintf не понятно #28
ахах чудеса %s%s%s account_get_auth_mute_reason(acc), account_get_auth_mute_reason(acc), account_get_auth_mute_reason(acc)

получается (null)PipecPipec (Pipec - причина )

что это может быть? можно конечно так и оставить, но будет не красиво постоянно видеть (null)... Можно как-то обрезать (null) что бы его небыло видно?
ну или помогите избавится от этой ошибки, бред какой-то
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.09.2013, 18:23     printf sprintf не понятно #29
karaulov6, Это не решение проблемы, а костыль. Нужно искать проблему и решать ее.
В таком случае более нормальным костылем будет сделать что-то вроде.

C++
1
2
char* cause = 0;
while (!(cause = account_get_auth_mute_reason(acc));
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
07.09.2013, 18:26  [ТС]     printf sprintf не понятно #30
Ну там очень много кода, я и за месяц не найду проблему, строка возвращается , но только с 2 раза работает. пытался вызвать перед sprintf функцию а потом там, но не получилось.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
07.09.2013, 18:32     printf sprintf не понятно #31
karaulov6,
ты пробовал
Цитата Сообщение от Nameless One Посмотреть сообщение
C++
1
2
3
const char *msg = account_get_auth_mute_reason(acc);
printf("%p\n", msg);
printf("%s\n", msg);
что в msg?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.09.2013, 18:36     printf sprintf не понятно #32
Цитата Сообщение от karaulov6 Посмотреть сообщение
ну или помогите избавится от этой ошибки, бред какой-то
Либо это баг функции account_get_strattr (в этом случае обращайся к разработчикам), либо на её работу неявно воздействуют внешние факторы (в этом случае воспользуйся костылём, предложенным ForEveR, пока не найдешь причину ошибки). Но я бы всё равно с разработчиками связался, в крайнем случае они подскажут, где у тебя ошибка.
karaulov6
15 / 15 / 1
Регистрация: 23.03.2013
Сообщений: 140
07.09.2013, 19:31  [ТС]     printf sprintf не понятно #33
ValeryS, работает так, строка доступна только после второго обращения? :O

Но без \n не работает всеравно


Так отлично работает(без (null) ), я думаю что-то со строкой не так. Даже если в переменную занести, то только со второго раза срабатывает.
C++
1
snprintf(msgtemp, sizeof(msgtemp), "%u часов. Причина: %.*s%s.", ((account_get_auth_mute_time(acc) - time(0)) / 3600), account_get_auth_mute_reason(acc), account_get_auth_mute_reason(acc));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2013, 19:53     printf sprintf не понятно
Еще ссылки по теме:

Sprintf и классы C++
C++ Аналог sprintf
C++ Sprintf

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
07.09.2013, 19:53     printf sprintf не понятно #34
Цитата Сообщение от karaulov6 Посмотреть сообщение
Даже если в переменную занести, то только со второго раза срабатывает.
Занесение в переменную никак на результат повлиять не должно. Я предложил это лишь для того, чтобы посмотреть возвращаемое значение функции, но ты потом скрин с отладкой выложил.

Скачал я исходники, там эта функция account_get_strattr ведёт к цепочке вызовов других функций, при этом в случае ошибки какого-либо вызова возвращается NULL. Одна из функций в цепочке — функция attrgroup_find_attr, и в ней есть такой любопытный код:

C
1
2
/* trigger loading of attributes if not loaded already */
if (attrgroup_load(attrgroup)) return NULL; /* eventlog happens earlier */
Т.е. здесь выполняется загрузка атрибутов, если они ещё не загружены. При этом в случае ошибки возвращается NULL.

Смотрим attrgroup_load:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
extern int attrgroup_load(t_attrgroup *attrgroup)
{
    assert(attrgroup);
    assert(attrgroup->storage);
 
    if (FLAG_ISSET(attrgroup->flags, ATTRGROUP_FLAG_LOADED))    /* already done */
    return 0;
    if (FLAG_ISSET(attrgroup->flags, ATTRGROUP_FLAG_DIRTY)) { /* if not loaded, how dirty ? */
    eventlog(eventlog_level_error, __FUNCTION__, "can't load modified account");
    return -1;
    }
 
    attrgroup_set_loaded(attrgroup);
    if (storage->read_attrs(attrgroup->storage, _cb_load_attr, attrgroup)) {
    eventlog(eventlog_level_error, __FUNCTION__, "got error loading attributes");
    return -1;
    }
    attrgroup_clear_dirty(attrgroup);
 
    return 0;
}
Это только моё предположение, но здесь может при первом вызове устанавливается флаг ATTRGROUP_FLAG_LOADED (строка "attrgoup_set_loaded(attrgroup);") затем в следующей строке возникает ошибка и в результате вся цепочка вызовов заканчивается возвратом NULL. При втором вызове флаг ATTRGROUP_FLAG_LOADED уже установлен, поэтому следующие операции не выполняются, и ты получаешь свой атрибут.

В общем, пройди в отладчике всю цепочку вызовов, обращая внимание на эти функции, и определи, почему при первом вызове account_get_auth_mute_reason возвращается NULL.

Добавлено через 2 минуты
Кстати, в функциях есть логирование, попробуй его включить.
Yandex
Объявления
07.09.2013, 19:53     printf sprintf не понятно
Ответ Создать тему
Опции темы

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