gets(buf);
Я знаю, gets(3)
удобно, и я знаю, что это игрушка, но , пожалуйста, не используйте gets(3)
.Невозможно написать безопасный код с gets(3)
, и есть реальная вероятность, что будущие библиотеки C могут даже не включать эту функцию.(Да, я знаю, что он стандартизирован, но мы можем надеяться, что в будущих версиях он будет опущен; POSIX.1-2008 удалил его.) Разумные компиляторы предупредят вас о его использовании.Вместо этого используйте fgets(3)
.
while (fgets(str, sizeof(str) / sizeof(str[0]), names) != NULL) {
sizeof(char)
определено как 1
.Это вряд ли изменится, и вы вряд ли измените тип массива.Как правило, это не имеет большого значения, но вы не можете использовать такую конструкцию так часто, как вы могли бы подозревать - вы можете использовать ее в этом случае только потому, что str[]
был объявлен в рамках объема этой строки.Если в качестве параметра передано str
, оператор sizeof(str)
вернет размер указателя данных, а , а не размер массива.Не слишком привыкайте к этой конструкции - она не всегда будет работать так, как вы ожидаете.
names = fopen("Beer_Names.txt", "r");
percent = fopen("Beer_Percentage.txt", "r");
while (fgets(str, sizeof(str) / sizeof(str[0]), names) != NULL) {
fgets(buffer, sizeof(buffer) / sizeof(buffer[0]), percent);
Пожалуйста, найдите время, чтобы проверить fopen(3)
на успех или неудачу.Это хорошая привычка, и если вы предоставите хорошее сообщение об ошибке, это может сэкономить ваше время и в будущем.Замените строки fopen()
чем-то вроде этого:
names = fopen("Beer_Names.txt", "r");
percent = fopen("Beer_Percentage.txt", "r");
if (!names) {
perror("failed to open Beer_Names.txt");
exit(1);
}
if (!percent) {
perror("failed to open Beer_Percentage.txt");
exit(1);
}
Вы можете заключить это в функцию, которая выполняет fopen()
, проверяет возвращаемое значение и либо печатает сообщение об ошибке и завершает работу, либо возвращаетFILE*
объект.
А теперь ошибка, которая привела вас сюда: Роберт указал, что fgets(3)
и gets(3)
обрабатывают завершающий перевод строки ввода по-разному.(Еще одна причина избавиться от gets(3)
как можно скорее.)