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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
karaulov6
16 / 16 / 2
Регистрация: 23.03.2013
Сообщений: 172
#1

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

07.09.2013, 15:26. Просмотров 1702. Ответов 33
Метки нет (Все метки)

Почему в 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 не понятно
Посмотрите здесь:

как i двигается понятно но вот не понятно как это делает j ? - C++
Здравствуйте, вопрос очень глупы но все же есть цикл for (int i = 0,j = 0; i < source.length; i++) как i двигается понятно но вот не...

Чем ::printf предпочтительнее printf? - C++
Смотрю на код одного толкового программиста и, как новичек в С++, удивляюсь: какой смысл писать в таком стиле? Это же вроде одно и то же....

Sprintf - C++
Первый круг проходит спокойно, а на втором ошибку выбивает, но я не могу найти где я ошибся: char Random2and4(char ***Massive) { ...

sprintf и % - C++
wsprinfA(buff,"%dasda"); как сделать так, что бы этот код работал ? экранирование % не помогает = \ Добавлено через 1 минуту ...

Аналог sprintf - C++
Здравствуйте! Допустим есть функция которая наращивает строку, добавлением строки/символа/числа или остальных объектов из которых можно...

Sprintf и классы - C++
Уважаемые, нужна помощь. Есть следующий класс: class tText { public: char *text; int x; int y; float R, G, B, A;...

Sprintf не работает - C++
Почему при запуске программа вырубается ? проблема где-то в sprintf #include <iostream> #include <cstdlib> #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.09.2013, 15:33     printf sprintf не понятно #2
karaulov6,
нормальный листинг приведи
karaulov6
16 / 16 / 2
Регистрация: 23.03.2013
Сообщений: 172
07.09.2013, 16:11  [ТС]     printf sprintf не понятно #3
Код pvpgn сервера? (проблема в sprintf или строке, что с ней может быть не так? )
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
07.09.2013, 16:16     printf sprintf не понятно #4
karaulov6, ты сам вызов sprintf привести хоть можешь? Вместе с определениями строк.

Вообще, читай до просветления: http://segfault.kiev.ua/smart-questions-ru.html

А пока вот тебе пример:
C
1
2
3
4
5
6
#include <stdio.h>
 
int main(void)
{
    printf("Hello, %s\n", NULL);
}
Вывод:
Код
Hello, (null)
karaulov6
16 / 16 / 2
Регистрация: 23.03.2013
Сообщений: 172
07.09.2013, 17:09  [ТС]     printf sprintf не понятно #5
Мне это не помогло

Мне нужно что бы вместо (null) была строка

ну вот часть кода из pvpgn сервера (модификация):

C++
1
2
3
4
5
6
7
8
9
10
11
    if (account_get_auth_mute(acc)==1)
    {
 
/* extern char  * account_get_auth_mute_reason(t_account * account) */
        char msgtemp[255];
        sprintf_s(msgtemp, sizeof(msgtemp), "Вы не можете писать на канале %u часа. Причина: %s.", ((account_get_auth_mute_time(acc) - time(0)) / 3600), account_get_auth_mute_reason(acc)); // был английский текст, что бы было понятно заменил на русский
        message_send_text(me, message_type_error, me, msgtemp);
        if (time(0) > account_get_auth_mute_time(acc))
            account_set_auth_mute(acc, 0);
      return;
    }
Причина: всегда (null) , а просто printf(account_get_auth_mute_reason(acc)) пишет строку
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.09.2013, 17:15     printf sprintf не понятно #6
Цитата Сообщение от karaulov6 Посмотреть сообщение
просто printf(account_get_auth_mute_reason(acc))
а ты не видишь что ты их по разному вызываешь?
что возвращает account_get_auth_mute_reason(acc)?
что будет если напишешь так ?
C++
1
printf("Вы не можете писать на канале %u часа. Причина: %s.", ((account_get_auth_mute_time(acc) - time(0)) / 3600), account_get_auth_mute_reason(acc));
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
07.09.2013, 17:20     printf sprintf не понятно #7
Цитата Сообщение от karaulov6 Посмотреть сообщение
Мне нужно что бы вместо (null) была строка
Я знаю. Я думал, что мой пример заставит тебя задуматься, почему у тебя получается "(null)". Но зря.

karaulov6, ты, я так понимаю, уже посмотрел в отладчике значения всех аргументов функции sprintf_s перед её вызовом?
karaulov6
16 / 16 / 2
Регистрация: 23.03.2013
Сообщений: 172
07.09.2013, 17:20  [ТС]     printf sprintf не понятно #8
Цитата Сообщение от ValeryS Посмотреть сообщение
а ты не видишь что ты их по разному вызываешь?
что возвращает account_get_auth_mute_reason(acc)?
что будет если напишешь так ?
C++
1
printf("Вы не можете писать на канале %u часа. Причина: %s.", ((account_get_auth_mute_time(acc) - time(0)) / 3600), account_get_auth_mute_reason(acc));

Теперь (null) пишет и в консоли...
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
07.09.2013, 17:21     printf sprintf не понятно #9
karaulov6, теперь до тебя дошло? Функция account_get_auth_mute_reason, судя по всему, возвращает NULL, вот и разбирайся, почему.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.09.2013, 17:22     printf sprintf не понятно #10
Цитата Сообщение от karaulov6 Посмотреть сообщение
Теперь (null) пишет и в консоли...
спецификацию на
account_get_auth_mute_reason()?
что она возвращает?
karaulov6
16 / 16 / 2
Регистрация: 23.03.2013
Сообщений: 172
07.09.2013, 17:26  [ТС]     printf sprintf не понятно #11
Цитата Сообщение от Nameless One Посмотреть сообщение
karaulov6, теперь до тебя дошло? Функция account_get_auth_mute_reason, судя по всему, возвращает NULL, вот и разбирайся, почему.

Тебе точно не дошло что я написал... PRINTF пишет строку если просто printf(account_get_auth_mute_reason) вызвать, проблема только в "%s"

Добавлено через 50 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
спецификацию на
account_get_auth_mute_reason()?
что она возвращает?
в коментарии я написал , extern char *
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
07.09.2013, 17:28     printf sprintf не понятно #12
karaulov6, ты уже возвращаемое значение account_get_auth_mute_reason проверил в отладчике?

Цитата Сообщение от karaulov6 Посмотреть сообщение
если просто printf(account_get_auth_mute_reason) вызвать
Если account_get_auth_mute_reason — функция, то в таком виде работать не может.
karaulov6
16 / 16 / 2
Регистрация: 23.03.2013
Сообщений: 172
07.09.2013, 17:29  [ТС]     printf sprintf не понятно #13
смеешься ? так я знаю что не будет, я просто не дописал в сообщении (acc)


snprintf(msgtemp, sizeof(msgtemp), account_get_auth_mute_reason(acc)); так пишет текст, а если "%s", account_get_auth_mute_reason(acc)) то (null)
мне кажется в строке чего-то не хватает... а как ее исправить не знаю
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.09.2013, 17:38     printf sprintf не понятно #14
Цитата Сообщение от karaulov6 Посмотреть сообщение
extern char *
это что за возвращаемое значение?
знаешь что означает слово extern
я еще раз спрашиваю про спецификацию
великий и могучий Гугле про такую функцию не знает

Добавлено через 4 минуты
Цитата Сообщение от karaulov6 Посмотреть сообщение
snprintf(msgtemp, sizeof(msgtemp), account_get_auth_mute_reason(acc));
ну напиши так
C++
1
2
snprintf(msgtemp, sizeof(msgtemp), account_get_auth_mute_reason(acc));
snprintf(msgtemp1, sizeof(msgtemp1),"bla bla %s",msgtemp);
у меня есть подозрение что account_get_auth_mute_reason возвращает указатель на локальный буфер,который следующая функция и затирает
karaulov6
16 / 16 / 2
Регистрация: 23.03.2013
Сообщений: 172
07.09.2013, 17:41  [ТС]     printf sprintf не понятно #15
ValeryS, ну воспользуйся гугл переводчиком ну пусть будет просто char * , проблема такая же

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
ну напиши так
C++
1
2
snprintf(msgtemp, sizeof(msgtemp), account_get_auth_mute_reason(acc));
snprintf(msgtemp1, sizeof(msgtemp1),"bla bla %s",msgtemp);
у меня есть подозрение что account_get_auth_mute_reason возвращает указатель на локальный буфер,который следующая функция и затирает
То же самое, я кстати такое уже пытался когда понял что просто printf работает



Мне гугл говорит про какую-то null terminal строку, что из-за этого не пашет.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.09.2013, 17:42     printf sprintf не понятно #16
Цитата Сообщение от karaulov6 Посмотреть сообщение
ValeryS, ну воспользуйся гугл переводчиком
а нахрена он мне ?
я то знаю что означает extern
Цитата Сообщение от karaulov6 Посмотреть сообщение
ну пусть будет просто char * ,
что значит пусть будет?
это твоя самописная функция?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
07.09.2013, 17:42     printf sprintf не понятно #17
Цитата Сообщение от karaulov6 Посмотреть сообщение
мне кажется в строке чего-то не хватает... а как ее исправить не знаю
Всё там хватает. Вот пример аналогичного вывода (причём все работает):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
char *get_message(void)
{
    return "42";
}
 
int main(void)
{
    char buf[BUFSIZ];
    snprintf(buf, sizeof buf, "Here is your message: %s\n", get_message());
    fputs(buf, stdout);
    return 0;
}
Я настаиваю, что дело в функции account_get_auth_mute_reason. Её исходники есть?
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.09.2013, 17:43     printf sprintf не понятно #18
Цитата Сообщение от karaulov6 Посмотреть сообщение
Мне гугл говорит про какую-то null terminal строку,
еще раз повторю за
Цитата Сообщение от Nameless One Посмотреть сообщение
ты уже возвращаемое значение account_get_auth_mute_reason проверил в отладчике?
karaulov6
16 / 16 / 2
Регистрация: 23.03.2013
Сообщений: 172
07.09.2013, 17:44  [ТС]     printf sprintf не понятно #19
Цитата Сообщение от Nameless One Посмотреть сообщение
Я настаиваю, что дело в функции account_get_auth_mute_reason. Её исходники есть?
C++
1
2
3
4
        extern char  * account_get_auth_mute_reason(t_account * account)
        {
            return account_get_strattr(account, "BNET\\acct\\mutereason");
        }
Но я уверяю что проблема не в ней, т.к используется функция сервера account_get_strattr, разве что баг сервера какой-то

Сейчас проверю в отладчике
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2013, 17:48     printf sprintf не понятно
Еще ссылки по теме:

Странный sprintf - C++
Структура, ее получение и вывод: struct User { int unk1; int unk2; int UserType; int unk3; int unk4; int Id; int...

Траблы с функцией sprintf - C++
Всем добрый день. У меня есть структура. После того как я забил все поля структуры мне нужно сформировать одну большую строку из этих...

c++ , sprintf() и Дух Плюсов - C++
Здравствуйте! Как вам известно во многих учебниках по С++ говорится, что функции printf и scanf использовать можно, но это не в стиле...

Ошибка с sprintf в C++ Opengl - C++
sprintf(sz, &quot;You win. Time: %d F2 - Restart game Esc - Exit&quot;, sec); error C4996: 'sprintf': This function or variable may be...

Sprintf отрабатывает по разному - C++
Если просто запустить программу то sprintf округляет тип double до целых, если в режиме отладки то нет. То есть в первом случае выдет 23 во...


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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
07.09.2013, 17:48     printf sprintf не понятно #20
Цитата Сообщение от karaulov6 Посмотреть сообщение
разве что баг сервера какой-то
Разве что функция NULL возвращает…

Что такой код показывает?
C
1
2
3
const char *msg = account_get_auth_mute_reason(acc);
printf("%p\n", msg);
printf("%s\n", msg);
Yandex
Объявления
07.09.2013, 17:48     printf sprintf не понятно
Ответ Создать тему
Опции темы

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