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

Странный sprintf - C++

Восстановить пароль Регистрация
 
jr_
9 / 9 / 2
Регистрация: 14.06.2016
Сообщений: 77
Завершенные тесты: 3
19.07.2016, 09:34     Странный sprintf #1
Структура, ее получение и вывод:
Кликните здесь для просмотра всего текста
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
struct User {
    int unk1;
    int unk2;
    int UserType;
    int unk3;
    int unk4;
    int Id;
    int ObjectId;
    wchar_t Name[48];
    int Race;
    int Sex;
    int ClassId;
    int Lvl;
    __int64 Exp;
    int Str;
    int Dex;
    int Con;
    int Int;
    int Wit;
    int Men;
    int unk5;
    int MaxHp;
    int CurrentHp;
    int MaxMp;
    int CurrentMp;
    int MaxWeight;
    int IsWeaponEquipped;
    int unk6;
    void* unk7[125];
    int Load;
    int Sp;
    int Accuracy;
    int Critical;
    int PAttack;
    int AttackSpeed;
    int Pdef;
    int Evasion;
    int MAttack;
    int MDef;
    int CastSpeed;
    int unk8;
    int unk9;
    int unk10;
    int unk11[14];
    int ClanId;
};
 
//...
 
    std::string UserInfo(User *user) {
        char buf[10000];
        const char *format = "\
                       unk1 %d\n\
                       unk2 %d\n\
                       usertype %d\n\
                       unk3 %d\n\
                       unk4 %d\n\
                       id %d\n\
                       objectid %d\n\
                       name %s\n\
                       race  %d\n\
                       sex %d\n\
                       classid %d\n\
                       lvl %d\n\
                       exp %d\n\
                       str %d\n\
                       dex %d\n\
                       con %d\n\
                       int %d\n\
                       wit %d\n\
                       men %d\n\
                       unk5 %d\n\
                       maxhp %d\n\
                       curhp %d\n\
                       maxmp %d\n\
                       curmp %d\
            ";
 
        sprintf(
            buf,
            format,
            user->unk1,
            user->unk2,
            user->UserType,
            user->unk3,
            user->unk4,
            user->Id,
            user->ObjectId,
            user->Name,
            user->Race,
            user->Sex,
            user->ClassId,
            user->Lvl,
            user->Exp,
            user->Str,
            user->Dex,
            user->Con,
            user->Int,
            user->Wit,
            user->Men,
            user->unk5,
            user->MaxHp,
            user->CurrentHp,
            user->MaxMp,
            user->CurrentMp
            );
 
        return std::string(buf);
    }
 
 
//...
 
void Utils::Log(std::string s1) {
    std::ofstream outfile;
 
    outfile.open("c:\\test.txt", std::ios_base::app);
    outfile << s1 << "\n--\n";
}
 
//...
 
User *user = GetNearestCreature(1, -1);
Utils::Log(UserInfo(user));
Вывод

unk1 0
unk2 0
usertype 0
unk3 0
unk4 0
id 0
objectid 1295068941
name Q
race 1
sex 1
classid 103
lvl 85
exp 3
str 16
dex 24
con 29
int 40
wit 29
men 30
unk5 0
maxhp 5758
curhp 5758
maxmp 4782
curmp 4782



Теперь, меняю спецификатор для поля __int64 Exp с %d на правильный %I64d -> exp %I64d\n\


и снова вывод

Кликните здесь для просмотра всего текста

unk1 0
unk2 0
usertype 0
unk3 0
unk4 0
id 0
objectid 1295068941
name Q
race 1
sex 1
classid 103
lvl 85
exp 68719476739
str 24 <-- почему поплыло?
dex 29
con 40
int 29
wit 30
men 0
unk5 5758
maxhp 5758
curhp 4782
maxmp 4782
curmp 98288


Удаление из строки формата отдельных переменных приводят к такому же результату.
Дамп этого куска памяти показывает что всё в норме.
Что за уличная магия?

P.S. Нет, я не могу в отладчике посмотреть, что там творится, поэтому приходится этим беспределом заниматься.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2016, 09:34     Странный sprintf
Посмотрите здесь:

C++ sprintf и %
Траблы с функцией sprintf C++
Ошибка с sprintf в C++ Opengl C++
printf sprintf не понятно C++
Sprintf и классы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
19.07.2016, 11:07     Странный sprintf #2
А почему бы Вам не перейти на iostream?
Все равно программа написана не на Си.
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
std::string UserInfo(User *user) 
{
    std::ostringstream ss; 
    ss<<unk1<<'\n'
        <<user->unk2<<'\n'
        <<user->UserType<<'\n'
        <<user->unk3<<'\n'
        <<user->unk4<<'\n'
        <<user->Id<<'\n'
        <<user->ObjectId<<'\n'
        <<user->Name<<'\n'
        <<user->Race<<'\n'
        <<user->Sex<<'\n'
        <<user->ClassId<<'\n'
        <<user->Lvl<<'\n'
        <<user->Exp<<'\n'
        <<user->Str<<'\n'
        <<user->Dex<<'\n'
        <<user->Con<<'\n'
        <<vuser->Int<<'\n'
        <<user->Wit<<'\n'
        <<user->Men<<'\n'
        <<user->unk5<<'\n'
        <<user->MaxHp<<'\n'
        <<user->CurrentHp<<'\n'
        <<user->MaxMp<<'\n'
        <<user->CurrentMp<<'\n';
    return ss.str();
}
jr_
9 / 9 / 2
Регистрация: 14.06.2016
Сообщений: 77
Завершенные тесты: 3
19.07.2016, 12:51  [ТС]     Странный sprintf #3
Потому что форматированный вывод всё таки поприятнее, имхо.

Предложенный вами вариант работает, вот только всё равно не понятно, что за аномалия с sprintf.
nmcf
4278 / 3709 / 1247
Регистрация: 14.04.2014
Сообщений: 14,503
19.07.2016, 14:20     Странный sprintf #4
%lld для int64. И как у тебя wchar_t выводится, не ясно - wprintf() тогда.
Yandex
Объявления
19.07.2016, 14:20     Странный sprintf
Ответ Создать тему
Опции темы

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