р = new char[strlen(buf)+1];
strcpy(p, buf);
в C++. Таким образом, если вы не видите +1, то стоит проверить все еще раз.
В Java такой проблемы нет, поскольку строки там не представляются в виде
массивов, оканчивающихся на 0. Кроме того, индексы массивов проверяются, так что
в Java выйти за границы массива невозможно.
В большинстве сред С и C++ предусмотрена библиотечная функция strdup, которая
создает копию строки, используя для этого malloc и st rcpy, что гарантирует от
обсуждавшейся чуть выше ошибки. К сожалению, st rdup не входит в стандарт ANSI
С.
Кстати говоря, ни в первой, ни в окончательной версии не проверяется значение,
возвращаемое функцией malloc. Мы опустили эту проверку для того, чтобы
сфокусировать ваше внимание на теме данного раздела, однако
в настоящей
программе значения, возвращаемые функциями malloc, realloc, strdup, а также
другими функциями, выделяющими память, должны в обязательном порядке
проверяться.
Используйте цепочки else-if для многовариантных ветвлений. Стандартной формой
записи многовариантного ветвления является последовательность операторов if. .
.else if...else:
if (условие 1)
выражение 1 else if (условие 2)
выражение 2
else if (условие п)
выражение п else
выражение по умолчанию
Условия читаются сверху вниз; по достижении первого
условия, которое оказалось
верным, выполняется следующее за ним выражение, после чего оставшаяся часть
конструкции пропускается. Под выражением мы, естественно, понимаем здесь либо
одно выражение, либо группу выражений, заключенную в фигурные скобки.
Последнее else обрабатывает ситуацию "по умолчанию" — когда ни одна из
перечисленных альтернатив не была выбрана. Это замыкающее else может быть
опущено, если
не предусматривается никаких действий "по умолчанию", однако и в
таком случае полезно оставить эту часть с сообщением об ошибке, чтобы отловить
условия, которых "не может быть никогда".
Все операторы else стоит выровнять по вертикали, вместо того чтобы устанавливать
каждое else на одном уровне с соответствующим ему if. Вертикальное выравнивание
означает, что проверки производятся
последовательно; кроме того,
предотвращается выползание кода за правый край страницы.
Последовательность вложенных выражений if —. предвестник трудно читаемого
кода, если не заведомых ошибок:
? if (argc == 3)
? if ((fin = fopen(argv[1], "г")) \= NULL)
? if ((tout = fopen(argv[2], >")) != NULL) {
? while ((c = getc(fin)) != EOF)