Ниже приведен быстрый способ удаления потенциального '\n'
из строки, сохраненной с помощью fgets()
.
Используется strlen()
, с 2 тестами.
char buffer[100];
if (fgets(buffer, sizeof buffer, stdin) != NULL) {
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
buffer[--len] = '\0';
}
Теперь используйте buffer
и len
при необходимости.
Этот метод имеет побочное преимущество значения len
для последующего кода.Это может быть легко быстрее, чем strchr(Name, '\n')
. Ref YMMV, но оба метода работают.
buffer
, из оригинала fgets()
не будет содержаться в "\n"
при некоторых обстоятельствах:
A)слишком длинная строка для buffer
, поэтому в buffer
сохраняется только char
, предшествующий '\n'
.Непрочитанные символы остаются в потоке.
B) Последняя строка в файле не заканчивается '\n'
.
Если на входе есть где-то встроенные нулевые символы '\0'
, длина, сообщаемая strlen()
, не будет включать местоположение '\n'
.
Некоторые вопросы, связанные с ответами:
strtok(buffer, "\n");
не удается удалить '\n'
, когда buffer
равно "\n"
.Из этого ответа - исправлено после этого ответа, чтобы предупредить об этом ограничении.
В редких случаях происходит сбой, когда первое значение char
, считанное fgets()
, равно '\0'
.Это происходит, когда ввод начинается со встроенного '\0'
.Затем buffer[len -1]
становится buffer[SIZE_MAX]
доступом к памяти, безусловно, за пределами допустимого диапазона buffer
.Что-то хакер может попробовать или найти в глупом чтении текстовых файлов UTF16.Это было состояние ответа , когда этот ответ был написан.Позже не-OP отредактировал его, включив в него код, подобный проверке этого ответа, для ""
.
size_t len = strlen(buffer);
if (buffer[len - 1] == '\n') { // FAILS when len == 0
buffer[len -1] = '\0';
}
sprintf(buffer,"%s",buffer);
- неопределенное поведение: Ref .Кроме того, он не сохраняет начальные, разделительные или конечные пробелы.Сейчас удалено .
[Изменить из-за исправления позже ответ ] С 1 вкладышем buffer[strcspn(buffer, "\n")] = 0;
проблем нет, кроме производительности какпо сравнению с strlen()
подходом.Производительность при обрезке обычно не является проблемой, учитывая, что код выполняет ввод-вывод - черная дыра процессорного времени.Если следующий код нуждается в длине строки или имеет высокую производительность, используйте этот подход strlen()
.Иначе, strcspn()
- прекрасная альтернатива.