C++. выход за пределы массива char при вводе строки большого размера. как исправить? - Вопросы по С+
  • Чаты 4chT.com в телеграмм
    Наши группы в телеграмм

Вопрос C++. выход за пределы массива char при вводе строки большого размера. как исправить?

Регистрация
23 Окт 2013
Сообщения
88
Репутация
0
Спасибо
0
Монет
0
Выдаёт ошибку когда пишу больше 9 символов.

Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted.



Как сделать, чтобы учитывались только первые 9 символов? String использовать нельзя.



#include <iostream>



using namespace std;



int main()

{

char c[10];

cin >> c;

cout << c;

return 0;

}
 
Регистрация
16 Сен 2013
Сообщения
84
Репутация
0
Спасибо
0
Монет
0
int main()
{
char c[100500];
cin >> c;
с[8]='\0';
cout
 
Регистрация
4 Сен 2013
Сообщения
82
Репутация
0
Спасибо
0
Монет
0
Нужно использовать либо cin.get, либо cin.getline (если нужно вводить строку с пробелами) - обе функции позволяют указать размер принимающего буфера и поставят завершающий 0 в последний символ строки.

#include
using namespace std;

int main() {
char c[10];
cin.get(c, 10);
//cin.getline(c, 10);
cout
 
Регистрация
30 Ноя 2013
Сообщения
93
Репутация
0
Спасибо
0
Монет
0
Компилятор обнови до стандарта C++20 или выше. Там оно и так будет шпарить.
 
Регистрация
11 Авг 2013
Сообщения
74
Репутация
0
Спасибо
0
Монет
0
НЕДОПУСТИМО использование для ввода конструкций вида char c[10];
cin >> c;
// или же
scanf("%s", &c); Это очень серьезная уязвимость, позволяющая атакующему провести атаку переполнением буфера с последующим выполнением произвольного кода в системе с правами пользователя, от имени которого запустили программу. Вообще, если что-то пишет в буфер не отслеживая его переполнение то это что-то должно пойти фтопку.
Безопасные методы ввода либо используют данные о размере буфера read( fd, buf, BUF_SIZE );
fgets( buf, BUF_SIZE, stdin );
std::cin.getline( buf, BUF_SIZE ); либо используют динамическое выделение памяти (это удобно но менее надежно, так как атакующий может вызвать крах программы, сбросив ей на вход данные очень большого размера) std::string line;
std::getline( std::cin, line ); или так int main( int argc, char* argv[] )
{
char* s = NULL;
printf("Пример ввода строки при помощи scanf:\n");
// Модификатор m приводит к тому, что место для строки
// выделяется в динамической памяти
scanf( "%ms", &s );
if( s )
{
printf( "Введена строка: '%s'\n", s );
// Освободим выделенную scanf память
free( s );
}
else
{
perror("scanf");
}
return 0;
}
 
Сверху Снизу