В следующем решении, есть один проход по линии. Если комментарий был найден (//
), мы прекращаем работу и печатаем его. поддержка (/* */
) требует больше работы.
while (fgets(line, LINE_LENGTH, file) != NULL)
{
size_t len = strlen(line);
size_t i;
for (i=0; i<len; i++)
{
if (line[i]=='/' && line[i + 1]=='/')
{
line[i] = '\0';
break;
}
}
fprintf(output, "%s", line);
}
обратите внимание на два момента в дополнение к логике:
при печати с использованием printf
всегда используйте строку формата. Если строка содержит%, это может сделать неожиданные вещи.
не ставьте strlen
в состояние цикла. Он генерирует множество ненужных циклов для вычисления длины.
Путем выполнения следующего:
List<User> users = Collections.emptyList();
тип возвращенного списка от Collections.emptyList();
будет , вывел как String
из-за левой стороны присвоения. Однако, если Вы предпочитаете не иметь этот вывод, можно определить его явно путем выполнения следующего:
List<User> users = Collections.<User>emptyList();
В этом конкретном экземпляре, это может появиться как избыточное большинству людей (на самом деле, я досмотрел очень мало кода до конца в дикой природе, которая использует явные аргументы типа), однако для метода с подписью: void doStuff(List<String> users)
это было бы совершенно чисто, чтобы один вызвал doStuff()
с явным аргументом типа следующим образом:
doStuff(Collections.<String>emptyList());
После создания пустого списка я рекомендовал бы хранить его как константу вместо того, чтобы создать новую каждый раз.
кроме того, существуют выигрыши в производительности к использованию Collections.emptyList()
по сравнению с new ArrayList(0)
, хотя разница является, вероятно, небольшой. Список, возвращенный emptyList (), оптимизирован, чтобы быть неизменным пустым списком. Например, размер () метод просто возвращается 0, а не полевой поиск или независимо от того, что ArrayList делает.