900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
1

Переполнение буфера при вводе

19.09.2017, 15:06. Показов 4134. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код
C++
1
2
char arr[10];
cin >> arr;
Он работает, но не очень понятно как, и судя по всему имеет проблемы.
Помогите пожалуйста разобраться.

1. Каким образом ввод строки заносится в массив char? У cin есть перегрузка для указателя на char, и в этой перегрузке побайтово данные записываются из буфера консоли в массив? Причём cout выводит все нормально, без мусора, как будто в конец массива был добавлен \0.

2. Предполагаю, что есть вероятность выйти за пределы массива если введённая строка окажется длинее чем буфер, то будет UB.

Единственный адекватный вариант для чтения строки в массив это посимвольное чтение со вставкой в конец \0 собственноручно когда введённое количество символов будет равно длине массива. Про string и его друзей знаю. Хочется именно разобраться с вводом cin в массив...

Добавлено через 15 минут
По моим тестам я вижу что запись идёт побайтово в буфер и в конец автоматически вставляется \0.
Но остаётся возможность переполнения буфера.

Кто нибудь знает точный ответ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.09.2017, 15:06
Ответы с готовыми решениями:

Переполнение буфера при поиске WNDDIR
string getWNDdir(){ TCHAR wndbuff; memset(wndbuff,0,sizeof(TCHAR)*sizeof(wndbuff)); string...

Переполнение при вводе int
Такой вот вопросик. есть переменная а типа integer, пользователь вводит число с клавиатуры, так вот...

Переполнение буфера
Объясните почему вылетает ошибка и помогите исправить. Зарание спасибо возникло переполнение...

Переполнение буфера
Не могу найти, где у меня ошибка, выдает переполнение буфера, подскажите пожалуйста. Здесь...

6
Модератор
Эксперт С++
13678 / 10888 / 6465
Регистрация: 18.12.2011
Сообщений: 29,050
19.09.2017, 15:31 2
Цитата Сообщение от Undisputed Посмотреть сообщение
Кто нибудь знает точный ответ?
Точный ответ будет таким:
используйте string
C++
1
2
string arr;
cin >> arr;
0
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
19.09.2017, 15:48  [ТС] 3
zss,
Про стринг знаю, речь именно о том как работает cin с массивом типа char

Добавлено через 11 минут
Нашёл в с++11.
C++11 27.7.2.2.3/9:

operator>> then stores a null byte (charT()) in the next position
Добавлено через 1 минуту
В общем \0 добавляется как последний элемент.
Выход за пределы массива конечно же надо контролировать самостоятельно
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
19.09.2017, 15:50 4
Цитата Сообщение от Undisputed Посмотреть сообщение
Каким образом ввод строки заносится в массив char?
тип char[] неявно приводится к char* и вызывается соответствующий метод std::istream::operator>>
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
19.09.2017, 19:36 5
Цитата Сообщение от Undisputed Посмотреть сообщение
Единственный адекватный вариант для чтения строки в массив это посимвольное чтение со вставкой в конец \0 собственноручно когда введённое количество символов будет равно длине массива.
Для строк есть getline():
C++
1
2
char arr[10];
cin.getline(arr, 10);
Лишнего не прочитает (максимум 9, и '\0' добавит десятым, вместо извлечённого из очереди '\n'). Но если в очереди ввода будет больше, чем 9 символов (без учёта '\n), то в потоке установится failbit.
1
Неэпический
18099 / 10685 / 2061
Регистрация: 27.09.2012
Сообщений: 26,895
Записей в блоге: 1
19.09.2017, 22:19 6
C++
1
std::cin >> std::setw(sizeof(arr)) >> arr;
0
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,292
19.09.2017, 22:38 7
C
1
fgets(arr, sizeof(arr), stdin);
0
19.09.2017, 22:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2017, 22:38
Помогаю со студенческими работами здесь

переполнение буфера
Что такое переполнение буфера?

Переполнение буфера
В программе имеется форма и записывается текстовые файлы. Когда она запускается всё работает...

Переполнение буфера
Подскажите, пожалуйста кто-нибудь, в чем беда... Во время выполения программы пишет, что буфер...

Переполнение буфера
Добрый день! В общем: #include "stdafx.h" #include <iostream> using namespace std; int...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru