Почему istream :: operator & gt; & gt; принимать указатели / массивы?

char someArray[n];
std::cin >> someArray; // potential buffer overrun

Я часто встречался с подобным кодом много раз на форумах C ++. Есть ли веские основания для того, чтобы это не рассматривалось как ошибка времени компиляции? или, по крайней мере, предупреждение?

0

Решение

Основная предпосылка с C (и C ++) заключается в том, что кодер должен знать, что они делают. В противном случае они будут кодировать на бейсике 🙂

Не допускается ошибка, так как это разрешено в соответствии со стандартом, как gets а также scanf("%s") разрешены в C, несмотря на то, что они проблемы, ожидающие, чтобы произойти.

Код, который вы разместили является плохо и не имеет места в серьезном программном обеспечении, но это хорошо для «игрушечных» программ или тестирования вещей. Вам просто нужно знать о его проблемах (и это звучит очень похоже на вас являются знать о них).

4

Другие решения

Если бы C ++ был изобретен одним махом, он, вероятно, вообще не существовал бы — если вы хотите прочитать строку, вам придется прочитать ее в std::stringи это было бы концом этого.

К сожалению, C ++ использовался довольно давно std::string был стандартизирован (или изобретен вообще). И то и другое operator>> а также istream::getline (не путать с std::getline) были изобретены за это время. Когда они были изобретены, реальной альтернативы было мало (или нет), поэтому они работали с массивами char.

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

0

По вопросам рекламы [email protected]