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

Как правильно занести данные в массив char и вывести их из него - C++

Восстановить пароль Регистрация
 
noeine
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 45
11.08.2013, 11:20     Как правильно занести данные в массив char и вывести их из него #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
    char a1[5][50]; //Массив в который надо перенести данные
    char a2[10] = "32167aqe"; //Массив - источних данных
    cout << "Musor v a1:" << endl; //Выводим содержимое массива a1[0] в который мы будем переносить данные из массива a2
    for (int i=0; i<50; i++) {
        cout << a1[0][i]; //Посимвольный вывод
    }
    cout << endl;
    memset(a1[0], NULL, 50); //Присваиваем NULL массиву a1[0] для того чтобы очистить его от мусора
 
    cout << "O4ishennij a1:" << endl;
    for (int i=0; i<50; i++) {
        cout << a1[0][i];
    }
 
    cout << endl << "Soderjimoe a2:" << a2 << endl;
 
    for (int i=0; i<10; i++) {
        if (a2[i] == 113) { //Копируем побейтово инфу из a2  в a1 пока не наткнемся на "q"
            //a1[0][i] = NULL;
            break;
        }
        a1[0][i]=a2[i];
    }
    cout << "Soderjimoe a1 posle perenosa infi is a2:" << endl;
    for (int i=0; i<50; i++) {
        cout << a1[0][i]; //Выводим содержимое всего массива a1[0]
    }
    system("pause");
У меня есть код, который получает входящую строку (в данном случае массив a2) и переносит нужное её содержимое в двумерный массив a1 исходя из знака разделителя. В данном случае происходит копирование лишь одного вхождения.
Вопрос мой заключается в следующем. Когда я создаю массив, изначально он забит мусором. Как я понимаю, если не весь массив будет забит моими данными и там останется пустое место, это открывает возможность для организации переполнения буфера. Правильно ли то что я перед тем как заполнять массив, применяю к нему команду:
C++
1
memset(a1[0], NULL, 50)
И только после этого начинаю наполнять его данными. Правильно ли я понимаю что если всё оставшееся место кроме того где сожержится нужная мне информация забито NULL, это кошерно и защитит от возможности переполнения?

И еще один вопрос, в место использования memset(a1[0], NULL, 50) (забивания всего массива до его заполнения), могу ли я просто когда кончается нужная мне информация, заносить в массив одну запись NULL, и считать это правильным завершением массива?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2013, 11:20     Как правильно занести данные в массив char и вывести их из него
Посмотрите здесь:

Как правильно создать двумерный массив указателей с использованием calloc? и ввод данных в него C++
Как правильно передать в процедуру массив строк char*? C++
Занести в массив значения функции и вывести его на экран C++
C++ Подскажите пожалуйста, как правильно вывести,сформировать массив из задания
Как перевести массив char[] в char* C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.08.2013, 11:24     Как правильно занести данные в массив char и вывести их из него #2
в данном случае вместо memset достаточно объявить и массив и инициализировать его первый элемент
C++
1
char a1[5][5] = { 0 };
все остальные элементы так же будут заполнены нулями

Цитата Сообщение от noeine Посмотреть сообщение
Правильно ли я понимаю что если всё оставшееся место кроме того где сожержится нужная мне информация забито NULL, это кошерно и защитит от возможности переполнения?
это зависит только от вас

Цитата Сообщение от noeine Посмотреть сообщение
И еще один вопрос, в место использования memset(a1[0], NULL, 50) (забивания всего массива до его заполнения), могу ли я просто когда кончается нужная мне информация, заносить в массив одну запись NULL, и считать это правильным завершением массива?
можно, почему бы и нет?
noeine
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 45
11.08.2013, 11:30  [ТС]     Как правильно занести данные в массив char и вывести их из него #3
Jupiter, Тогда у меня вопрос чисто относительно теории. Как я правильно понял читая книгу, что ко взлому приложения может привести неправильное завершение переменной\массива. То есть если я делаю
C++
1
char test[100]
и в первые допустим 5 байт заношу нужную мне информацию, и никак не завершаю массив, не с помощью NULL, ни инициализируя его изначально нулём, то оставшиеся 95 байт массива взломщик может использовать в своих целях, а инициализация массива нулем, или же установка следующего после окончания полезной информации байта в состояние NULL, предотвращает это?

Просто учусь программировать и программировать изначально хочу правильно, а не переучиваться потом и зализывать раны нанесенные мне моим будущим начальством из-за того что я думая что делаю всё правильно, писал программы в корне не верно
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.08.2013, 11:39     Как правильно занести данные в массив char и вывести их из него #4
Цитата Сообщение от noeine Посмотреть сообщение
установка следующего после окончания полезной информации байта в состояние NULL, предотвращает это?
нет
Цитата Сообщение от noeine Посмотреть сообщение
Как я правильно понял читая книгу, что ко взлому приложения может привести неправильное завершение переменной\массива. То есть если я делаю
C++
1
char test[100]
и в первые допустим 5 байт заношу нужную мне информацию, и никак не завершаю массив, не с помощью NULL, ни инициализируя его изначально нулём, то оставшиеся 95 байт массива взломщик может использовать в своих целях, а инициализация массива нулем, или же установка следующего после окончания полезной информации байта в состояние NULL, предотвращает это?
Вы видимо неправильно поняли. Допустим у нас есть пароль, который сохранили в ваш массив test. После того как этот массив был использован (т.е. пароль больше не нужен), нужно обнулить весь массив test. Вот тут и приходить на помощь memset, но...
noeine
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 45
11.08.2013, 12:11  [ТС]     Как правильно занести данные в массив char и вывести их из него #5
Jupiter, огромное спасибо http://smayly.ru/gallery/anime/EmoAnime/90.gif

Добавлено через 7 минут
А насколько оправданным будет применение этой функции к локальным массивам и переменным? Насколько я понимаю они самоликвидируются в тот момент когда функция завершила своё выполнение и передала управление вышестоящей области видимости.

Полагаю эту функцию надо применять к глобальным переменным да?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.08.2013, 12:25     Как правильно занести данные в массив char и вывести их из него #6
Цитата Сообщение от noeine Посмотреть сообщение
А насколько оправданным будет применение этой функции к локальным массивам и переменным? Насколько я понимаю они самоликвидируются в тот момент когда функция завершила своё выполнение и передала управление вышестоящей области видимости.
Применение оправдано тем как организована память.
Пример с переменными на стеке
C++
1
2
3
4
5
6
{
    int i; //сдвинули указатель на верхушку стека на sizeof(int) байта
    char test[100]; //сдвинули указатель на верхушку стека ещё на 100 байт
    //...
 
} // вернули указатель стека в начальное положение - таким каким оно было до входа в блок фигурных скобок
все манипуляции происходят лишь с указателем на верхушку стека, ни о каком затирании(обнулении) данных речи нет.
Yandex
Объявления
11.08.2013, 12:25     Как правильно занести данные в массив char и вывести их из него
Ответ Создать тему
Опции темы

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