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

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

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

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

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

Почему в printf строка отображается нормально, а sprintf вместо строки вставляет "(null)" ?

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


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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
07.09.2013, 15:33 #2
karaulov6,
нормальный листинг приведи
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
07.09.2013, 16:11  [ТС] #3
Код pvpgn сервера? (проблема в sprintf или строке, что с ней может быть не так? )
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
07.09.2013, 16:16 #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)
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
07.09.2013, 17:09  [ТС] #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)) пишет строку
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
07.09.2013, 17:15 #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));
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
07.09.2013, 17:20 #7
Цитата Сообщение от karaulov6 Посмотреть сообщение
Мне нужно что бы вместо (null) была строка
Я знаю. Я думал, что мой пример заставит тебя задуматься, почему у тебя получается "(null)". Но зря.

karaulov6, ты, я так понимаю, уже посмотрел в отладчике значения всех аргументов функции sprintf_s перед её вызовом?
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
07.09.2013, 17:20  [ТС] #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) пишет и в консоли...
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
07.09.2013, 17:21 #9
karaulov6, теперь до тебя дошло? Функция account_get_auth_mute_reason, судя по всему, возвращает NULL, вот и разбирайся, почему.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
07.09.2013, 17:22 #10
Цитата Сообщение от karaulov6 Посмотреть сообщение
Теперь (null) пишет и в консоли...
спецификацию на
account_get_auth_mute_reason()?
что она возвращает?
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
07.09.2013, 17:26  [ТС] #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 *
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
07.09.2013, 17:28 #12
karaulov6, ты уже возвращаемое значение account_get_auth_mute_reason проверил в отладчике?

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


snprintf(msgtemp, sizeof(msgtemp), account_get_auth_mute_reason(acc)); так пишет текст, а если "%s", account_get_auth_mute_reason(acc)) то (null)
мне кажется в строке чего-то не хватает... а как ее исправить не знаю
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
07.09.2013, 17:38 #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 возвращает указатель на локальный буфер,который следующая функция и затирает
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 238
Завершенные тесты: 1
07.09.2013, 17:41  [ТС] #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 строку, что из-за этого не пашет.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2013, 17:41
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.09.2013, 17:41
Ответ Создать тему
Опции темы

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