Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
noeine
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 45
#1

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

11.08.2013, 11:20. Просмотров 1066. Ответов 5
Метки нет (Все метки)

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, и считать это правильным завершением массива?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2013, 11:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно занести данные в массив char и вывести их из него (C++):

Как правильно передать в процедуру массив строк char*? - C++
Нужно чтобы процедура возвращала измененный массив. Пытаюсь так: Void sss(char**arr) { *arr=&quot;i&quot;; } возвращает...

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

Как правильно вывести массив? - C++
Почему не выводит нужные цифры?

Не знаю как правильно вывести массив - C++
Помогите найти ошибку.. #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main(int argc, char *argv) { ...

Занести в массив данные с помощью указателей, определить сумму и колличество положительных элементов - C++
дан вещественный массив vector &lt;float&gt; D5 . занести в массив данные с помощью указателей , определить сумму и колличество положительных...

Занести в массив значения функции и вывести его на экран - C++
Занести в массив значения функции \operatorname{f} (x, y) = (x + y)^2, \; 0 \le x \le 5, \, 0 \le y \le 3 и вывести его на экран

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

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

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

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

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

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

Подскажите пожалуйста, как правильно вывести,сформировать массив из задания - C++
Дан массив С из 16 элементов.Нужно:проинициализировать массив С, вывод промежуточных данных и массивов на экран. а) Сформировать массив...

Прочитать определенные строки из файла, занести в массив и вывести в консоль - C++
есть файл { Имя : Александр, Фамилия : Александров, Возраст : 20 }, { Город : Москва, Дети : 2} как считать только...

Создать файл,потом записать в него данные и вывести их на консоль - C++
Не могу понять что я делаю не так.Программа должна создать файл,потом записать в него данные и потом вывести их на экран,и походу где то я...

Как перевести массив char[] в char* - C++
Не знаю как перевести массив char в переменную char*


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru