Есть много «правильных» решений;«лучшее» - это вопрос мнения, но ваше первое решение семантически неверно, а второе излишне неэлегантно.
Первое можно «исправить», инициализировав i
в -1, но это небыть идиоматичнымТакже ни одно из ваших предложений не проверяет EOF, который может возникнуть, например, при перенаправлении ввода из файла или при комбинации клавиш CTRL для конкретной платформы.
Следующее локализует индексную переменную и проверяет EOF:
for( int i = 0;
i < MAX && // Will fit in buffer AND
(ch = getchar()) != '\n' && // is not newline AND
ch != EOF; // is not end-of-file
i++ ;
{
sentence[i] = ch ;
}
Это имеет смысл, поскольку оно точно отражает ваш выходной цикл. Локализация, если i
предотвращает проблемы обслуживания, которые могут возникнуть из-за использования i
для различных целей в этом коде. Вы должны аналогичным образом локализовать выходной индекс.
Ни одна из ваших реализаций не резервирует пространство для нулевого терминатора, который может быть преднамеренным, но в противном случае, либо:
char sentence[MAX + 1] ;
ограничивающего под-выраженияi < MAX - 1
, или лучше i < sizeof(sentence) - 1
- последний защищает от изменений в объявлении sentence
, возможно, используя что-то отличное от MAX
при будущем обслуживании или повторном использовании.