Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15

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

11.02.2012, 12:58. Показов 8261. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно из названия темы. Есть строка символов (к примеру такая: 0430002004370430043904340438)
Как перевести ее в читабельный вид, т.е в текст. Уже всю голову сломал Подскажите что прочитать(ссылочку если можно)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2012, 12:58
Ответы с готовыми решениями:

Прилетают данные UTF-8, как правильно преобразовать в читабельный вид?
Как преобразовать вот это: cout << buf<<endl; Выдает в UTF-8 кодировке: 01%3Aasd+%D0%92%D0%B0%D1%81%D0%B8%D0%BB%D0%B8%D0%B9 ...

Как написать читабельный код
Здравствуйте, я программирую на C++, и вот вижу, что у других программистов код не такой, как у меня. У других куча комментариев, всяких...

Как перевести строку в число?
есть строка вида 14-09-2015 надо перевести в дату как?

56
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
13.02.2012, 08:48  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
сначала вызываешь MultiByteToWideChar
мне же нужно как-то получить wchar_t, что бы засунуть его в качестве аргумента в unicode_to_1251.
Или можно по другому сделать?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
13.02.2012, 09:11
Цитата Сообщение от 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 };
1
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 15
13.02.2012, 09:37  [ТС]
кажется работает. Огромное Вам СПАСИБО
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.02.2012, 11:23
dimmu, всё же я доделал вариант из поста 19, мой недочёт был в том что 430 была 16-ричная а не десятичная запись WCHAR и 430Hex == 1072 что в UTF-8 соответсвует символу 'a' русское. Ниже скрин, код и готовый проект на плюсах, который переводит ваш текст \u0430\u0020\u0437\u0430\u0439\u0434\u04 38
Для упрощения вводу - строку текста 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 байт, 11 просмотров)
Тип файла: rar SMS2Hex.exe.rar (69.6 Кб, 6 просмотров)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.02.2012, 11:27
А и да ещё одно дополнение - руссификацию консольного вывода проводил с помощью system("chcp 1251"); поэтому если при первом запуске вылезет билеберда с русским(как на скрине) то нужно всего лишь произвести настройку шрифта консоли - как это сделать см ссылку
Создание файла в UTF-8 кодировке
Миниатюры
Как перевести строку в читабельный вид?  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
13.02.2012, 11:32
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, то эти данные ты бы скорее всего убил
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.02.2012, 11:48
Также предлагаю вариант кода для любителей С, функционал аналогичен функционалу кода приведенного в посте 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;
}
Миниатюры
Как перевести строку в читабельный вид?  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.02.2012, 11:54
Цитата Сообщение от 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
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
13.02.2012, 12:07
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
См мнемосхемму
Не понял здесь ничего. Уже неоднократно говорил, что надо нелениться потратить лишние пару минут на внятные объяснения, чтобы диалог не превращался из одного вопроса-ответа в десять вопросов-ответов, где сэкономленные две минуты сто раз перестают окупаться

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

Добавлено через 4 минуты
По поводу примера из поста 44. Как думаешь, что тебе скажет твоя программа, если встретит последовательность "\u0fff"?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.02.2012, 12:47
Цитата Сообщение от 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;
}
Миниатюры
Как перевести строку в читабельный вид?  
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.02.2012, 13:00
-=ЮрА=-,


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]
Аварийный останов
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
13.02.2012, 13:31
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Суть в следующем каждому неинициализированному 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;
}
При исполнении получим следующее и как бы тут всё нормально:

Code
1
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;
}
При исполнении получим:

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

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
(в разделе экспертов рассматривали рассматривали и так никто и не привёл такой вариант выделения памяти)
Если правильно ответишь на предыдущий вопрос, то очевидным образом поймёшь, почему такой вариант никто не приводил
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.02.2012, 13:44
Цитата Сообщение от Evg Посмотреть сообщение
как через cout в 16-ричном виде печатать
cout<<hex<<value;
для hex нужен <iomanip>
на счёт указателей надо подумать, пока собираюсь с мыслями...
0
14.02.2012, 17:47

Не по теме:

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

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
14.02.2012, 18:37
А оценивать-то что надо? Если метод, при помощи которого работает довыделение памяти, то в посте #49 я уже о нём писал. Если о реализации самого класса, то, закрв глаза на основной бардак хочется упомянуть о концептуально неправильном построении метода alloc. Данный метод должен принимать только размер и ничегоне возвращать. А вся работа с m_Str должна выполняться внутри него (в противном случае, нафига вообще нужно было использовать класс, если не использовать по нормальному инкапсуляцию). А код, в котором делается delete на параметр метода - это моветон
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
14.02.2012, 18:49
Evg, там задание было о строках, в контексте того задания решил реализовать realloc для вводимой строки, я выполнил его с названием alloc т.к. он имеет чуточку большие чем у С-ного собрата возможности, если память под ptr не выделена то выделим её, если память уже выделена и нужно изменить её размер, то изменяем...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
14.02.2012, 18:58
Неважно. alloc - это не есть универсальная функция, а всего лишь метод класса. Хотя ты его попытался сделать как универсальный метод (типа если у нас несколько указателей внутри класса, то для всех них как бы можно работать через этот метод). Я бы так делать не стал. На мой взгляд это корявая реализация. Если уж очень нужно работать с несколькими указателями, то лучше завести отдельный класс для динамически расширяемого массива char'ов. Оно куда логичнее будет выглядеть.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2012, 18:58

Как перевести строку в BSTR*
Как перевести обычную строку в BSTR* ???

Как перевести массив в строку?
я хочу чтобы можно было вводить какую нибудь строку,чтобы она переводилась в заглавные или прописные буквы...о как это сделать , я не знаю...

Перевести символ в двичный вид
Добрый день, помогите пожалуйста перевести символ в двичный вид, я не совсем понимаю, как это делается, спасибо большое! Символы у меня в...

перевести с турбо паскаля в с++ вид
type konf=record name: string; cena:integer; god:integer; mag:integer; end; var kon: array of konf; I,k,max:...

Как перевести строку в hex и обратно?
Немогу найти в гугле функцию какбы перевести строку в hex и обратно, мб у кого завалялась?


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

Или воспользуйтесь поиском по форуму:
57
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru