Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Как избежать переполнение буфера при считывании

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Как избежать переполнение буфера при считывании
Имя
Сообщение << Старые топики   Новые топики >>
Как избежать переполнение буфера при считывании - 2007-08-07 11:36:21.280000   
Pe4ka

Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
У меня, наверное тупой, но все же вопрос: Как надо грамотно считывать с клавиатуры строку так, чтобы избежать переполнения веделяемого буфера?
Например: У меня возникали трудности во всех перечисленных методах  [если пытаться считать 2-е строки, и переполнив вводом первую - со второй возникали проблемы, или с обоими]:
Пример1:char a[30], b[30]; cin&nbsp;&gt;&gt; a; //че-то делаю, но не над a cin &gt;&gt;b; Пример2:char a[30], b[30]; cin.getline(a,sizeof(a)-1); //че-то делаю, но не над a cin.getline(b,sizeof(b)-1); Пример3:char a[30], b[30]; gets(a); //че-то делаю, но не над a gets(b); Во всех примереах мне не удаётся корректно считать строку при переполнении.
Как этого избежать?
Может я че упустил или не правельно написа?

ЗЫ: Посимвольный ввод не предлогать
Post #: 1
RE: Как избежать переполнение буфера при считывании - 2007-08-07 14:13:43.846666   
JD_WERT

Сообщений: 117
Оценки: 0
Присоединился: 2007-07-12 06:59:16.613333
quote:

char buff[10];
cout &lt;&lt; "Input: ";
cin.get(buff, sizeof(buff));
cout &lt;&lt; "Result: " &lt;&lt; buff &lt;&lt; endl;
Post #: 2
RE: Как избежать переполнение буфера при считывании - 2007-08-07 14:16:26.896666   
Pe4ka

Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
quote:

ORIGINAL: Pe4ka

[если пытаться считать 2-е строки, и переполнив вводом первую - со второй возникали проблемы, или с обоими]

 
В твоём примере, ты считываешь только 1-у строку, считай 2-е и переполни хотяб первую…тогда появятся ошибки
Post #: 3
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:01:33.770000   
JD_WERT

Сообщений: 117
Оценки: 0
Присоединился: 2007-07-12 06:59:16.613333
quote:

ЗЫ: Посимвольный ввод не предлогать

А почему так категорично?
quote:

#include &lt;iostream&gt;
using namespace std;

void s_get(char* buff, size_t max)
{
while(–max)
{
if ((*buff = cin.get()) == '\n')
break;
*buff++;
}
*buff = '\0';
}

void main()
{
char buff1[10], buff2[10];

cout &lt;&lt; "Input_1: ";
s_get(buff1, sizeof(buff1));

cout &lt;&lt; "Input_2: ";
s_get(buff2, sizeof(buff2));

cout &lt;&lt; "Result_1: " &lt;&lt; buff1 &lt;&lt; "; Result_2: " &lt;&lt; buff2 &lt;&lt; endl;
}

Post #: 4
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:07:08.323333   
Pe4ka

Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
Ты, похоже, не уловил суть проблемы. Твоя программа тоже работает не корректно при переполнении буфера. Проверь сам: введи в "Интпут1" строку из 15 символов.
Проблема-то в этом.
Post #: 5
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:11:45.203333   
JD_WERT

Сообщений: 117
Оценки: 0
Присоединился: 2007-07-12 06:59:16.613333
Все лишние символы переходят во вторую строку. Но это "особенность" буферизованного ввода-вывода" сишника.
Post #: 6
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:19:58.870000   
Pe4ka

Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
Я это заметил +) А можно ли этого избежать?
Post #: 7
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:21:54.903333   
tt_andrey

Сообщений: 213
Оценки: 0
Присоединился: 2007-07-03 13:54:36.440000
quote:

Я это заметил +) А можно ли этого избежать?

можно только если считать и прооигнорировать все лишние символы
Post #: 8
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:24:09.280000   
tt_andrey

Сообщений: 213
Оценки: 0
Присоединился: 2007-07-03 13:54:36.440000
или же fflush(stdin) после первого ввода
Post #: 9
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:32:53.320000   
Pe4ka

Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
Блин…я ваще не понимаю, что происходит…вот примитивный код:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char b[10], a[10]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "a:"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; a; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "b:"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; b; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;endl &lt;&lt; a&lt;&lt;endl&lt;&lt; b; Скажем, при в а, я ввожу: "1111111111111", в b: "2222", при выводе я получаю: что b - содержит: "2222", а а - "11111111111112222"…объесните мне тупому как это возможно? … Я ж не указателем пользуюсь…
Post #: 10
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:34:08.573333   
Pe4ka

Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
quote:

ORIGINAL: tt_andrey

quote:

Я это заметил +) А можно ли этого избежать?

можно только если считать и прооигнорировать все лишние символы

С fflush(stdin), результот тотже, что я описал выше.
Post #: 11
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:52:51.360000   
JD_WERT

Сообщений: 117
Оценки: 0
Присоединился: 2007-07-12 06:59:16.613333
Объединяя
quote:

char buff1[10], buff2[10];

cout &lt;&lt; "Input_1: ";
s_get(buff1, sizeof(buff1));

cout &lt;&lt; "Input_2: ";
s_get(buff2, sizeof(buff2));


и это:
quote:

или же fflush(stdin) после первого ввода

Получаем это:
quote:

char buff1[10], buff2[10];

cout &lt;&lt; "Input_1: ";
cin.get(buff1, sizeof(buff1));

fflush(stdin);

cout &lt;&lt; "Input_2: ";
cin.get(buff2, sizeof(buff2));

cout &lt;&lt; "Result_1: " &lt;&lt; buff1 &lt;&lt; "; Result_2: " &lt;&lt; buff2 &lt;&lt; endl;
Post #: 12
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:55:03.066666   
JD_WERT

Сообщений: 117
Оценки: 0
Присоединился: 2007-07-12 06:59:16.613333
quote:

Скажем, при в а, я ввожу: "1111111111111", в b: "2222", при выводе я получаю: что b - содержит: "2222", а а - "11111111111112222"…объесните мне тупому как это возможно? … Я ж не указателем пользуюсь…

А вот это уже классическое переполнение буфера
Post #: 13
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:57:05.693333   
Pe4ka

Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
Ы) Всё спасибо, вродь разобрался…просто я использовал функцию getline…а с get все шикарненько. Всем спс.
Post #: 14
RE: Как избежать переполнение буфера при считывании - 2007-08-07 18:48:55.803333   
Kill_em_all

Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
Используй STL и преполнения у тебя не будет.Нужно писать маштабируемые приложения ;)
Post #: 15
RE: Как избежать переполнение буфера при считывании - 2007-08-08 23:52:28.153333   
nixo

Сообщений: 213
Оценки: 0
Присоединился: 2006-06-25 20:22:26

quote:

ORIGINAL: Pe4ka

Блин…я ваще не понимаю, что происходит…вот примитивный код:        char b[10], a[10];        cout &lt;&lt; "a:";        cin &gt;&gt; a;        cout &lt;&lt; "b:";        cin &gt;&gt; b;        cout &lt;&lt;endl &lt;&lt; a&lt;&lt;endl&lt;&lt; b; Скажем, при в а, я ввожу: "1111111111111", в b: "2222", при выводе я получаю: что b - содержит: "2222", а а - "11111111111112222"…объесните мне тупому как это возможно? … Я ж не указателем пользуюсь…

ибо при выводе строки а происходит собсно ее вывод до тех пор пока не встретится символ конца строки, т.е. a[9] должен быть равен символу '\0'. при вводе строки длиной до 9 символов компилятор вставит в последний элемент массива этот символ конца строки. а так как ты ввел 13 символов (если я правильно посчитал), то ты затер этот 0 и вышел за пределы массива. и при выводе этого массива после первых 9 символов фактически происходит вывод всего дампа памяти до тех пор пока там не встретится 0 (символ конца строки).а так как в памяти сразу после массива а расположен массив б(ибо локальные переменные располагаются в стеке, то есть сначала выделяется память для массива б 10 байт, затем по адресу (б-10) располагаются 10 байт массива а), то мы как раз и видим его содержимое на экране(вывод происходит от меньших адресов к большим). массив б содержит четыре сивола '2' и символ '\0'. поэтому после вывода нуля вывод собсно и прекращается. не будь в программе массива б, то на экране ты бы увидел всякую чепуху.
зы. если я в чем-то не прав, поправьте
Post #: 16
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Как избежать переполнение буфера при считывании







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.