Как избежать переполнение буфера при считывании
Пользователи, просматривающие топик: 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 >> a;
//че-то делаю, но не над a
cin >>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);
Во всех примереах мне не удаётся корректно считать строку при переполнении. Как этого избежать? Может я че упустил или не правельно написа? ЗЫ: Посимвольный ввод не предлогать
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 14:13:43.846666
|
|
|
JD_WERT
Сообщений: 117
Оценки: 0
Присоединился: 2007-07-12 06:59:16.613333
|
quote:
char buff[10]; cout << "Input: "; cin.get(buff, sizeof(buff)); cout << "Result: " << buff << endl;
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 14:16:26.896666
|
|
|
Pe4ka
Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
|
quote:
ORIGINAL: Pe4ka [если пытаться считать 2-е строки, и переполнив вводом первую - со второй возникали проблемы, или с обоими] В твоём примере, ты считываешь только 1-у строку, считай 2-е и переполни хотяб первую…тогда появятся ошибки
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:01:33.770000
|
|
|
JD_WERT
Сообщений: 117
Оценки: 0
Присоединился: 2007-07-12 06:59:16.613333
|
quote:
ЗЫ: Посимвольный ввод не предлогать А почему так категорично? quote:
#include <iostream> 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 << "Input_1: "; s_get(buff1, sizeof(buff1)); cout << "Input_2: "; s_get(buff2, sizeof(buff2)); cout << "Result_1: " << buff1 << "; Result_2: " << buff2 << endl; }
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:07:08.323333
|
|
|
Pe4ka
Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
|
Ты, похоже, не уловил суть проблемы. Твоя программа тоже работает не корректно при переполнении буфера. Проверь сам: введи в "Интпут1" строку из 15 символов. Проблема-то в этом.
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:11:45.203333
|
|
|
JD_WERT
Сообщений: 117
Оценки: 0
Присоединился: 2007-07-12 06:59:16.613333
|
Все лишние символы переходят во вторую строку. Но это "особенность" буферизованного ввода-вывода" сишника.
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:19:58.870000
|
|
|
Pe4ka
Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
|
Я это заметил +) А можно ли этого избежать?
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:21:54.903333
|
|
|
tt_andrey
Сообщений: 213
Оценки: 0
Присоединился: 2007-07-03 13:54:36.440000
|
quote:
Я это заметил +) А можно ли этого избежать? можно только если считать и прооигнорировать все лишние символы
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:24:09.280000
|
|
|
tt_andrey
Сообщений: 213
Оценки: 0
Присоединился: 2007-07-03 13:54:36.440000
|
или же fflush(stdin) после первого ввода
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:32:53.320000
|
|
|
Pe4ka
Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
|
Блин…я ваще не понимаю, что происходит…вот примитивный код: char b[10], a[10];
cout << "a:";
cin >> a;
cout << "b:";
cin >> b;
cout <<endl << a<<endl<< b;
Скажем, при в а, я ввожу: "1111111111111", в b: "2222", при выводе я получаю: что b - содержит: "2222", а а - "11111111111112222"…объесните мне тупому как это возможно? … Я ж не указателем пользуюсь…
|
|
|
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), результот тотже, что я описал выше.
|
|
|
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 << "Input_1: "; s_get(buff1, sizeof(buff1)); cout << "Input_2: "; s_get(buff2, sizeof(buff2)); и это: quote:
или же fflush(stdin) после первого ввода Получаем это: quote:
char buff1[10], buff2[10]; cout << "Input_1: "; cin.get(buff1, sizeof(buff1)); fflush(stdin); cout << "Input_2: "; cin.get(buff2, sizeof(buff2)); cout << "Result_1: " << buff1 << "; Result_2: " << buff2 << endl;
|
|
|
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"…объесните мне тупому как это возможно? … Я ж не указателем пользуюсь… А вот это уже классическое переполнение буфера
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 15:57:05.693333
|
|
|
Pe4ka
Сообщений: 27
Оценки: 0
Присоединился: 2007-07-04 14:53:56.090000
|
Ы) Всё спасибо, вродь разобрался…просто я использовал функцию getline…а с get все шикарненько. Всем спс.
|
|
|
RE: Как избежать переполнение буфера при считывании - 2007-08-07 18:48:55.803333
|
|
|
Kill_em_all
Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
|
Используй STL и преполнения у тебя не будет.Нужно писать маштабируемые приложения ;)
|
|
|
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 << "a:";
cin >> a;
cout << "b:";
cin >> b;
cout <<endl << a<<endl<< b;
Скажем, при в а, я ввожу: "1111111111111", в b: "2222", при выводе я получаю: что b - содержит: "2222", а а - "11111111111112222"…объесните мне тупому как это возможно? … Я ж не указателем пользуюсь… ибо при выводе строки а происходит собсно ее вывод до тех пор пока не встретится символ конца строки, т.е. a[9] должен быть равен символу '\0'. при вводе строки длиной до 9 символов компилятор вставит в последний элемент массива этот символ конца строки. а так как ты ввел 13 символов (если я правильно посчитал), то ты затер этот 0 и вышел за пределы массива. и при выводе этого массива после первых 9 символов фактически происходит вывод всего дампа памяти до тех пор пока там не встретится 0 (символ конца строки).а так как в памяти сразу после массива а расположен массив б(ибо локальные переменные располагаются в стеке, то есть сначала выделяется память для массива б 10 байт, затем по адресу (б-10) располагаются 10 байт массива а), то мы как раз и видим его содержимое на экране(вывод происходит от меньших адресов к большим). массив б содержит четыре сивола '2' и символ '\0'. поэтому после вывода нуля вывод собсно и прекращается. не будь в программе массива б, то на экране ты бы увидел всякую чепуху. зы. если я в чем-то не прав, поправьте
|
|
|
|
|