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

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

11.02.2012, 12:58. Показов 7357. Ответов 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru