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

Как перевести строку в читабельный вид? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 5.00
dimmu
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
11.02.2012, 12:58     Как перевести строку в читабельный вид? #1
Собственно из названия темы. Есть строка символов (к примеру такая: 0430002004370430043904340438)
Как перевести ее в читабельный вид, т.е в текст. Уже всю голову сломал Подскажите что прочитать(ссылочку если можно)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimmu
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
13.02.2012, 08:48  [ТС]     Как перевести строку в читабельный вид? #41
Цитата Сообщение от Evg Посмотреть сообщение
сначала вызываешь MultiByteToWideChar
мне же нужно как-то получить wchar_t, что бы засунуть его в качестве аргумента в unicode_to_1251.
Или можно по другому сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
13.02.2012, 09:11     Как перевести строку в читабельный вид? #42
Цитата Сообщение от dimmu Посмотреть сообщение
мне же нужно как-то получить wchar_t, что бы засунуть его в качестве аргумента в unicode_to_1251
То, что из себя представляет твоя строка цифр - это изначально является массивом из wchar_t. Разумеется, если трактовать её как набор байтов (набор пар байтов), а не как строку из цифр. В исходнике из поста #31 там даже в комментарии об этом написано.

Для понятности пример из поста #13 следовало переписать так:

вместо

C
1
2
char str[] = { 0x30, 0x04, 0x20, 0x00, 0x37, 0x04, 0x30, 0x04,
               0x39, 0x04, 0x34, 0x04, 0x38, 0x04, 0x00, 0x00 };
написать

C
1
wchar_t str[] = { 0x0430, 0x0020, 0x0437, 0x0430, 0x0439, 0x0434, 0x0438, 0x0000 };
dimmu
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
13.02.2012, 09:37  [ТС]     Как перевести строку в читабельный вид? #43
кажется работает. Огромное Вам СПАСИБО
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2012, 11:23     Как перевести строку в читабельный вид? #44
dimmu, всё же я доделал вариант из поста 19, мой недочёт был в том что 430 была 16-ричная а не десятичная запись WCHAR и 430Hex == 1072 что в UTF-8 соответсвует символу 'a' русское. Ниже скрин, код и готовый проект на плюсах, который переводит ваш текст \u0430\u0020\u0437\u0430\u0439\u0434\u0438
Для упрощения вводу - строку текста SMS-ки помещаем в файл sms.txt котрый и на экране а также в файле out.txt получаем готовый текст
Код С++
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
#include <windows.h>
#include <iostream>
#include <fstream>
#include <clocale>
#include <string>
#include <cmath>
using namespace std;
 
char * Utf2Ascii(WCHAR*lpw)
{
    long uLen = WideCharToMultiByte(CP_ACP, 0, lpw,   -1,  NULL, NULL, NULL, NULL);
    char *str = new char[uLen];
                WideCharToMultiByte(CP_ACP, 0, lpw, uLen,  str , uLen, NULL, NULL);
    return str;
}
//Г*        ' ' a+7  a     a+9  a+4  a+8
//0430 0020 0437 0430 0439 0434 0438
int getHEXCode(int code)
{
    int ipow = 0;
    int iHEX = (code%10);
    while(0 <  (code /= 10))
    {
        ipow += 1;
        iHEX += (code%10)*pow(16,1.0*ipow);
    }
    return iHEX;
}
 
int main()
{
    //setlocale(LC_ALL, "Russian");
    system("chcp 1251");
    string text;
    string line;
    WCHAR  *lpw = new WCHAR[2];
    WCHAR  *add = 0;
    char * sout = 0;
    long fpos = -1;
    long code = -1;
    long nchr = 0;
    ofstream ofs;
    ifstream ifs("sms.txt");
    if(!ifs)
        cout<<"ГЌГҐ ìîãó îòêðûòü sms.txt\n";
    else
    {
        while(getline(ifs,line))
            text += line;
        ifs.close();
        cout<<"Г„Г*Г*Г*ûå ГґГ*éëГ* :\n"<<text<<endl;
        while((fpos = text.find("\\u",fpos + 1)) != -1)
        {
            line = text.substr(fpos + 2,4);
            code = atoi(line.c_str());
            lpw[nchr] = getHEXCode(code);
            nchr++;
            //ÄèГ*Г*ìè÷åñêè Г*ëî÷èì ГЇГ*ìÿòü äëÿ lpw
            add = new WCHAR[2];
            lpw[nchr] = add[0];
        }
        lpw[nchr] = 0;
        if(!(sout = Utf2Ascii(lpw)))
            cout<<"ГЋГёГЁГЎГЄГ* ïðåîáðГ*çîâГ*Г*ГЁГї\n";
        else
        {
            cout<<"ÏðåîáðГ*çîâГ*Г*Г*ûå Г¤Г*Г*Г*ûå :\n"<<sout<<endl;
            ofs.open("out.txt");
            if(!ofs)
                cout<<"ГЌГҐ ìîãó ñîçäГ*ГІГј ГґГ*éë out.txt\n";
            else
                ofs<<sout;
            if(ofs)
                ofs.close();
            delete [] sout;
        }
    }
    system("pause");
    return 0;
}


Вот и всё что добавили в изначальный алгоритм
C++
1
2
3
4
5
6
7
8
9
10
11
int getHEXCode(int code)
{
    int ipow = 0;
    int iHEX = (code%10);
    while(0 <  (code /= 10))
    {
        ipow += 1;
        iHEX += (code%10)*pow(16,1.0*ipow);
    }
    return iHEX;
}

Не по теме:

PS:Также предлагаю читающим этот пост обратить внимание на realloc в стиле плюсов

C++
1
2
add = new WCHAR[2];
lpw[nchr] = add[0];
(в разделе экспертов рассматривали рассматривали и так никто и не привёл такой вариант выделения памяти)

Миниатюры
Как перевести строку в читабельный вид?  
Вложения
Тип файла: txt sms.txt (42 байт, 10 просмотров)
Тип файла: rar SMS2Hex.exe.rar (69.6 Кб, 5 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2012, 11:27     Как перевести строку в читабельный вид? #45
А и да ещё одно дополнение - руссификацию консольного вывода проводил с помощью system("chcp 1251"); поэтому если при первом запуске вылезет билеберда с русским(как на скрине) то нужно всего лишь произвести настройку шрифта консоли - как это сделать см ссылку
Создание файла в UTF-8 кодировке
Миниатюры
Как перевести строку в читабельный вид?  
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
13.02.2012, 11:32     Как перевести строку в читабельный вид? #46
C
1
2
3
4
5
6
7
while (...)
{
  lpw[nchr] = getHEXCode(code); // <------
  nchr++;
  add = new WCHAR[2];
  lpw[nchr] = add[0]; // <------
}
На первой итерации цикла в строках, помеченных стрелками, произойдёт запись в lpw[0] и lpw[1] соответсвенно. На второй итерации - в lpw[1] и lpw[2] и т.д.. Объясни мне, как выход за границу массива в виде записи в lpw[2] является аналогом realloc'а. У тебя этот код работает только потому, что выходя за границу массива ты не затрираешь полезные данные, а потомянно перезатираешь свои новые динамически выделенные элементы add[0] и add[1], да и то только потому, что выделение памяти сработало таким образом, что эти два никому ненужных элемента оказались в памяти после твоих lpw. Если бы в цикле ты сделал ещё какой-нибудь полезный new, то эти данные ты бы скорее всего убил
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2012, 11:48     Как перевести строку в читабельный вид? #47
Также предлагаю вариант кода для любителей С, функционал аналогичен функционалу кода приведенного в посте 44
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
#include <windows.h>
#include <stdio.h>
#include <math.h>
 
char * Utf2Ascii(WCHAR*lpw)
{
    long uLen = WideCharToMultiByte(CP_ACP, 0, lpw,   -1,  NULL, NULL, NULL, NULL);
    char *str = new char[uLen];
                WideCharToMultiByte(CP_ACP, 0, lpw, uLen,  str , uLen, NULL, NULL);
    return str;
}
//Г*        ' ' a+7  a     a+9  a+4  a+8
//0430 0020 0437 0430 0439 0434 0438
int getHEXCode(int code)
{
    int ipow = 0;
    int iHEX = (code%10);
    while(0 <  (code /= 10))
    {
        ipow += 1;
        iHEX += (code%10)*pow(16,1.0*ipow);
    }
    return iHEX;
}
 
int main()
{
    system("chcp 1251");
    WCHAR *lpw  = (WCHAR *)malloc(sizeof(WCHAR));
    char * text = 0;
    char * line = 0;
    char * sout = 0;
    long sLen = -1;
    long fpos = -1;
    long code = -1;
    long nchr = 0;
    FILE *ofs = 0;
    FILE *ifs = fopen("sms.txt","rb");
    if(!ifs)
        printf("ГЌГҐ ìîãó îòêðûòü sms.txt\n");
    else
    {
        fseek(ifs,0,SEEK_END);
        sLen = ftell(ifs);
        fseek(ifs,0,SEEK_SET);
        if(!(text = (char *)malloc((1 + sLen)*sizeof(char))))
            printf("ГЋГёГЁГЎГЄГ* âûäåëåГ*ГЁГї ГЇГ*ìÿòè ïîä Г¤Г*Г*Г*ûå ГґГ*éëГ*\n");
        else
        {
            if(!fread(text,1,sLen,ifs))
                printf("ГЋГёГЁГЎГЄГ* Г·ГІГҐГ*ГЁГї ГґГ*éëГ*\n");
            else
                text[sLen] = '\0';//ÓáðГ*ëè ìóñîð ГўГЄГ®Г*öå text
        }
        fclose(ifs);
        if(text)
        {
            printf("Г„Г*Г*Г*ûå ГґГ*éëГ* :\n%s\n",text);
            line = strtok(text,"\\u");
            while(line && lpw)
            {
                code = atoi(line);
                lpw[nchr] = getHEXCode(code);
                //ÄèГ*Г*ìè÷åñêè Г*ëî÷èì ГЇГ*ìÿòü äëÿ lpw
                lpw = (WCHAR *)realloc
                    (
                        (void *)lpw,
                        (1 + (nchr = nchr + 1))*sizeof(WCHAR)
                    );
                if(!lpw)
                    printf("ГЋГёГЁГЎГЄГ* âûäåëåГ*ГЁГї ГЇГ*ìÿòè ïîä ГЎГіГґГҐГ° WCHAR\n");
                line = strtok(NULL,"\\u");
            }
            lpw[nchr] = 0;
            if(!(sout = Utf2Ascii(lpw)))
                printf("ГЋГёГЁГЎГЄГ* ïðåîáðГ*çîâГ*Г*ГЁГї\n");
            else
            {
                printf("ÏðåîáðГ*çîâГ*Г*Г*ûå Г¤Г*Г*Г*ûå :\n%s\n",sout);
                ofs = fopen("out.txt","wb");
                if(!ofs)
                    printf("ГЌГҐ ìîãó ñîçäГ*ГІГј ГґГ*éë out.txt\n");
                else
                    fprintf(ofs,"%s",sout);
                if(ofs)
                    fclose(ofs);
            }
        }
    }
    system("pause");
    if(lpw)
        free((void *)lpw);
    if(sout)
        free((void *)sout);
    return 0;
}
Миниатюры
Как перевести строку в читабельный вид?  
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2012, 11:54     Как перевести строку в читабельный вид? #48
Цитата Сообщение от Evg Посмотреть сообщение
На первой итерации цикла в строках, помеченных стрелками, произойдёт запись в lpw[0] и lpw[1] соответсвенно. На второй итерации - в lpw[1] и lpw[2] и т.д.. Объясни мне, как выход за границу массива в виде записи в lpw[2] является аналогом realloc'а. У тебя этот код работает только потому, что выходя за границу массива ты не затрираешь полезные данные, а потомянно перезатираешь свои новые динамически выделенные элементы add[0] и add[1], да и то только потому, что выделение памяти сработало таким образом, что эти два никому ненужных элемента оказались в памяти после твоих lpw. Если бы в цикле ты сделал ещё какой-нибудь полезный new, то эти данные ты бы скорее всего убил
- на счёт выделения не соглашусь
См мнемосхемму
вход в цикл : lpw [][?]
lpw[nchr] = getHEXCode(code);//lpw [x][?]
add = new WCHAr[2];//add[!][?]
lpw[?] = add[!]
lpw[x][!][?] возврат к началу с lpw из 3-х элементов
Если есть претензии к плюсовому аллоку посмотри вариант С, там простой realloc
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
13.02.2012, 12:07     Как перевести строку в читабельный вид? #49
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
См мнемосхемму
Не понял здесь ничего. Уже неоднократно говорил, что надо нелениться потратить лишние пару минут на внятные объяснения, чтобы диалог не превращался из одного вопроса-ответа в десять вопросов-ответов, где сэкономленные две минуты сто раз перестают окупаться

По поводу примера из поста 47. Довыделением памяти по одному байту - это очень плохой стиль программирования. Нормальный подоход - выделить, к примеру, 1000 байт, а когда они исчерпались - довыделить ещё 1000 байт. Такой код однозначно будет работать быстрее и с хорошей вероятностью будет потреблять меньше памяти (из-за отсутствия кривой фрагментации в виде маленьких учстков)

Добавлено через 4 минуты
По поводу примера из поста 44. Как думаешь, что тебе скажет твоя программа, если встретит последовательность "\u0fff"?
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2012, 12:47     Как перевести строку в читабельный вид? #50
Цитата Сообщение от Evg Посмотреть сообщение
Как думаешь, что тебе скажет твоя программа, если встретит последовательность "\u0fff"
- я преобразую 0fff посредством atio 0fff она не воспримет, не уверен что в тексте сможем встретить такой символ(я же под юникод текста программу разрабатываю, код любого символа меньше 1251(кодовая страница), ну можно ввести доп функцию проверки, если строка \uxxx содержит на позициях xxx не цифры, данный символ не обрабатывать или переводить в значение самописным велосипедом, на который просто жаль времени на написание - это не суть важно как по мне)
На счёт внятного объяснения С++ realloc см код ниже:
Суть в следующем каждому неинициализированному 1-му сконца элементу вектора vec прилепливаем память субвектора add из 2-х элементов, таким образом в блоке vec расширяем на 1-ку конечный маркер использованой памяти, а тем временем "убиваем" наш субвектор add. В общем "обманываем систему - двигая маркер конца использованного блока)
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
#include <iostream>
#include <iomanip>
using namespace std;
 
void out_vec(int n, int * vec)
{
    for(int i = 0; i < n; i++)
        cout<<setw(3)<<vec[i];
    cout<<endl;
}
 
int main()
{
    int i;
    int *add = 0;
    int *vec = new int[2];
    int nmax = 0;
    while(true)
    {
        system("cls");
        cout<<"Enter max num of elements in array : ";cin>>nmax;
        for(i = 0; i < nmax;i++)
        {
            vec[i]  = i + 1;
            cout<<"[Iteration #"<<vec[i]<<"]"<<endl;
            out_vec(i + 1, vec);
            add = new int[2];
            vec[i + 1] = add[0];
            delete [] add;
        }
        system("pause");
    }
    return 0;
}
Миниатюры
Как перевести строку в читабельный вид?  
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.02.2012, 13:00     Как перевести строку в читабельный вид? #51
-=ЮрА=-,


C++
1
2
3
4
5
6
7
8
9
                for(i = 0; i < nmax;i++)
                {
                        vec[i]  = i + 1;
                        cout<<"[Iteration #"<<vec[i]<<"]"<<endl;
                        out_vec(i + 1, vec);
                        add = new int[2];
                        vec[i + 1] = add[0];
                        delete [] add;
                }
Могу довольно сильно разочаровать. У нас есть два указателя.
Ты сначала ставишь итому элементу число. Потом выделяешь память под другой указатель (значения в нем лежат мусорные) - затем записываешь в первую ячейку памяти значение второй ячейки памяти. Йазз?

Добавлено через 1 минуту
Bash
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
forever@pterois:~/My_pro1/cpp_pro$ ./new 
Enter max num of elements in array : 1
[Iteration #1]
  1
Enter max num of elements in array : 3
[Iteration #1]
  1
[Iteration #2]
  1  2
[Iteration #3]
  1  2  3
*** glibc detected *** ./new: free(): invalid pointer: 0x089fe018 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6ebc2)[0xb764dbc2]
/lib/i386-linux-gnu/libc.so.6(+0x6f862)[0xb764e862]
/lib/i386-linux-gnu/libc.so.6(cfree+0x6d)[0xb765194d]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb780880f]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdaPv+0x1b)[0xb780886b]
./new[0x80488fe]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75f8113]
./new[0x80486e1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 fc:03 5505432    /home/forever/My_pro1/cpp_pro/new
08049000-0804a000 r--p 00000000 fc:03 5505432    /home/forever/My_pro1/cpp_pro/new
0804a000-0804b000 rw-p 00001000 fc:03 5505432    /home/forever/My_pro1/cpp_pro/new
089fe000-08a1f000 rw-p 00000000 00:00 0          [heap]
b7400000-b7421000 rw-p 00000000 00:00 0 
b7421000-b7500000 ---p 00000000 00:00 0 
b7594000-b7596000 rw-p 00000000 00:00 0 
b7596000-b75b2000 r-xp 00000000 fc:01 654451     /lib/i386-linux-gnu/libgcc_s.so.1
b75b2000-b75b3000 r--p 0001b000 fc:01 654451     /lib/i386-linux-gnu/libgcc_s.so.1
b75b3000-b75b4000 rw-p 0001c000 fc:01 654451     /lib/i386-linux-gnu/libgcc_s.so.1
b75b4000-b75dc000 r-xp 00000000 fc:01 657529     /lib/i386-linux-gnu/libm-2.13.so
b75dc000-b75dd000 r--p 00028000 fc:01 657529     /lib/i386-linux-gnu/libm-2.13.so
b75dd000-b75de000 rw-p 00029000 fc:01 657529     /lib/i386-linux-gnu/libm-2.13.so
b75de000-b75df000 rw-p 00000000 00:00 0 
b75df000-b7755000 r-xp 00000000 fc:01 657521     /lib/i386-linux-gnu/libc-2.13.so
b7755000-b7757000 r--p 00176000 fc:01 657521     /lib/i386-linux-gnu/libc-2.13.so
b7757000-b7758000 rw-p 00178000 fc:01 657521     /lib/i386-linux-gnu/libc-2.13.so
b7758000-b775b000 rw-p 00000000 00:00 0 
b775b000-b7839000 r-xp 00000000 fc:01 132098     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b7839000-b783a000 ---p 000de000 fc:01 132098     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b783a000-b783e000 r--p 000de000 fc:01 132098     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b783e000-b783f000 rw-p 000e2000 fc:01 132098     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b783f000-b7846000 rw-p 00000000 00:00 0 
b785b000-b785f000 rw-p 00000000 00:00 0 
b785f000-b7860000 r-xp 00000000 00:00 0          [vdso]
b7860000-b787e000 r-xp 00000000 fc:01 654127     /lib/i386-linux-gnu/ld-2.13.so
b787e000-b787f000 r--p 0001d000 fc:01 654127     /lib/i386-linux-gnu/ld-2.13.so
b787f000-b7880000 rw-p 0001e000 fc:01 654127     /lib/i386-linux-gnu/ld-2.13.so
bfab5000-bfad6000 rw-p 00000000 00:00 0          [stack]
Аварийный останов
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
13.02.2012, 13:31     Как перевести строку в читабельный вид? #52
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Суть в следующем каждому неинициализированному 1-му сконца элементу вектора vec прилепливаем память субвектора add из 2-х элементов, таким образом в блоке vec расширяем на 1-ку конечный маркер использованой памяти, а тем временем "убиваем" наш субвектор add. В общем "обманываем систему - двигая маркер конца использованного блока)
Давай смоделируем твой поведение на коротеньком примере. Уж извини за исползование printf'а, но я никак не могу запомнить, как через cout в 16-ричном виде печатать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main (void)
{
  char *lpw = new char[2];
  char *add;
  long nchr = 0;
 
  for (int i = 0; i < 100; i++)
    {
      lpw[nchr] = 0x80 + i;
      nchr++;
      add = new char[2];
      lpw[nchr] = add[0];
    }
 
  for (int i = 0; i < 100; i++)
    printf ("%02x ", (unsigned char) lpw[i]);
  printf ("\n");
 
  return 0;
}
При исполнении получим следующее и как бы тут всё нормально:

Код
80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3
Теперь в код введём три новых указателя, для которых сделано динамическое выделение памяти, заполним их значениями, а в конце распечатаем:

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
#include <stdio.h>
 
int main (void)
{
  char *lpw = new char[2];
  char *add;
  long nchr = 0;
 
  int *pa = new int;
  *pa = 0x11111111;
  int *pb = new int;
  *pb = 0x22222222;
  int *pc = new int;
  *pc = 0x33333333;
 
  for (int i = 0; i < 100; i++)
    {
      lpw[nchr] = 0x80 + i;
      nchr++;
      add = new char[2];
      lpw[nchr] = add[0];
    }
 
#if 0
  for (int i = 0; i < 100; i++)
    printf ("%02x ", (unsigned char) lpw[i]);
  printf ("\n");
#endif
 
  printf ("*pa = 0x%x\n", *pa);
  printf ("*pb = 0x%x\n", *pb);
  printf ("*pc = 0x%x\n", *pc);
 
  return 0;
}
При исполнении получим:

Код
*pa = 0x93929190
*pb = 0xa3a2a1a0
*pc = 0xb3b2b1b0
Внимание вопрос! Почему значения, записанные по указателям pa, pb и pc испортились?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
(в разделе экспертов рассматривали рассматривали и так никто и не привёл такой вариант выделения памяти)
Если правильно ответишь на предыдущий вопрос, то очевидным образом поймёшь, почему такой вариант никто не приводил
-=ЮрА=-
Заблокирован
Автор FAQ
13.02.2012, 13:44     Как перевести строку в читабельный вид? #53
Цитата Сообщение от Evg Посмотреть сообщение
как через cout в 16-ричном виде печатать
cout<<hex<<value;
для hex нужен <iomanip>
на счёт указателей надо подумать, пока собираюсь с мыслями...
-=ЮрА=-
14.02.2012, 17:47
  #54

Не по теме:

ForEveR, Evg, динамичесский realloc в С++
Изменить программу
Жду замечаний и предложений по усовершенствованию..!

Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
14.02.2012, 18:37     Как перевести строку в читабельный вид? #55
А оценивать-то что надо? Если метод, при помощи которого работает довыделение памяти, то в посте #49 я уже о нём писал. Если о реализации самого класса, то, закрв глаза на основной бардак хочется упомянуть о концептуально неправильном построении метода alloc. Данный метод должен принимать только размер и ничегоне возвращать. А вся работа с m_Str должна выполняться внутри него (в противном случае, нафига вообще нужно было использовать класс, если не использовать по нормальному инкапсуляцию). А код, в котором делается delete на параметр метода - это моветон
-=ЮрА=-
Заблокирован
Автор FAQ
14.02.2012, 18:49     Как перевести строку в читабельный вид? #56
Evg, там задание было о строках, в контексте того задания решил реализовать realloc для вводимой строки, я выполнил его с названием alloc т.к. он имеет чуточку большие чем у С-ного собрата возможности, если память под ptr не выделена то выделим её, если память уже выделена и нужно изменить её размер, то изменяем...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2012, 18:58     Как перевести строку в читабельный вид?
Еще ссылки по теме:

Перевести длинную бинарную строку в строку с десятичными цифрами C++
Как перевести строку из string в char? C++
Как перевести строку в hex и обратно? C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
14.02.2012, 18:58     Как перевести строку в читабельный вид? #57
Неважно. alloc - это не есть универсальная функция, а всего лишь метод класса. Хотя ты его попытался сделать как универсальный метод (типа если у нас несколько указателей внутри класса, то для всех них как бы можно работать через этот метод). Я бы так делать не стал. На мой взгляд это корявая реализация. Если уж очень нужно работать с несколькими указателями, то лучше завести отдельный класс для динамически расширяемого массива char'ов. Оно куда логичнее будет выглядеть.
Yandex
Объявления
14.02.2012, 18:58     Как перевести строку в читабельный вид?
Ответ Создать тему
Опции темы

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