read () из stdin не игнорирует перевод строки
=============================================

Я использую следующее условное утверждение для чтения из стандартного ввода.

При вводе данных из стандартного ввода, как правило, пользователь нажимает ввод по завершении. Но`read()` считает & n; в качестве ввода тоже в этом случае`n = 1` и условное не оценивается как ложное. Есть ли способ сделать условную оценку ложной, когда пользователь нажимает ввод (без ввода чего-либо) на стандартном вводе, кроме проверки содержимого buf. Есть ли другая функция, кроме`read()` что я могу использовать для этого ??

В этом отношении, что может быть способом для чтения, чтобы определить конец ввода, когда вход поступает со стандартного ввода (стандартное ввод)?

When inputting data from standard input, generally the user presses enter when done. But read() considers '\n' as input too in which case n = 1 and the conditional doesn't evaluate to false.

Первый пункт, безусловно, верно. Клавиша ввода эквивалентна клавише новой строки, поэтому, когда пользователь нажимает клавишу ввода, клавиатура генерирует символ новой строки, и`read()` поэтому функция возвращает этот символ. Крайне важно, чтобы он это сделал.

Следовательно, ваше условие ошибочно - пустая строка будет содержать символ новой строки и, следовательно, количество байтов будет равно единице. Действительно, есть только один способ получить`read()` вызов для возврата 0, когда стандартным вводом является клавиатура, и это для ввода 'EOF'; символ - обычно control-D в Unix, control-Z в DOS. В Unix этот символ интерпретируется драйвером терминала как «отправка предыдущих входных данных в программу, даже если еще нет новой строки». И если пользователь больше ничего не набрал в строке, то возврат из`read()` будет ноль. Если входные данные поступают из файла, то после прочтения последних данных последующие чтения вернут 0 байтов.

Если вход поступает из канала, то после прочтения всех данных в канале`read()` вызов будет блокироваться до тех пор, пока не будет закрыт последний дескриптор файла, который может записать в канал; если этот дескриптор файла находится в текущем процессе, то`read()` будет висеть вечно, хотя зависший процесс никогда не сможет`write()` к дескриптору файла - конечно, при условии однопоточного процесса.



например

или используйте, например, fgets, и просто удалите \ n



 что нет способа сделать это без изучения содержимого буфера. Даже readline () делает именно это. В любом случае, почему вы против этого?



`fgets()` для вашей задачи (ловить ввод пользователя), но даже`fgets()` сохраняет символ новой строки в буфере.

Однако, если есть новая строка, вы можете быть уверены, что это последний символ в строке, поэтому его легко удалить.



`>1` вместо`!=0`

единственные ложные срабатывания - односимвольные ответы с последующим прерыванием (EOF)