Intereting Posts

Лучший способ читать stdin, который может включать новую строку?

Я должен написать программу в C, которая обрабатывает новую строку как часть строки. Мне нужен способ обработки символа новой строки таким образом, что если он встречается, он не обязательно завершает ввод. Пока я использую fgets (), но останавливается, как только он достигает символа ‘\ n’. Есть ли хорошая функция для обработки ввода с консоли, которая не обязательно заканчивается символом новой строки?

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

Редактировать: Если это уже не очевидно, я полный новичок в C

fgets получает строку из streamа. Строка определяется как завершающая строка новой строки, конец файла или ошибка, поэтому вы этого не хотите.

Вероятно, вы хотите использовать fgetc . Вот пример кода файла ac program fgetc.c

 #include  int main (void) { int c; while ((c = fgetc(stdin)) != EOF) fputc(c, stdout); } 

скомпилируйте вот так:

 cc fgetc.c -o fgetc 

используйте это (обратите внимание на символ новой строки \ n):

 echo 'Hello, thar!\nOh, hai!' | ./fgetc 

или вот так:

 cat fgetc.c | ./fgetc 

Прочтите руководство по функциям fgetc, чтобы узнать больше: man fgetc

Если я правильно понял ваш вопрос, вы хотите прочитать его со стандартного ввода до тех пор, пока пользователь не закончит печатать (что, конечно, не является новой линией). Это можно сделать, установив флаг, например EOF, при вводе. Один из способов, которым я столкнулся, заключается в следующем:

 #include  int main(void) { char ch; char str[100]; int i = 0; setbuf (stdout,NULL); while ( (ch = getchar()) != EOF)// user can input until the EOF which he or she enters to mark the end of his/her typing or more appropriately input. { str[i] = ch;// you can store all the input character by character in a char array i++; } printf ("%s",str);// then you can print it at last as a whole return 0; } 

ПРИМЕЧАНИЕ BEGINNER- EOF может варьироваться от системы к системе, поэтому проверьте его и введите правильный EOF для вашей системы.

Если вы просто читаете блоки информации без необходимости scanf() , то fread() может быть тем, что вам нужно. Но на консолях вы можете прочитать \ n, обратите внимание на \ n, а затем продолжайте читать больше, если вы решите, что \ n не для вас.

scanf работает при использовании по назначению. В частности, он обрабатывает \ n как пробел.

В зависимости от того, как ваше приложение закодировано (то есть, как определяются буферы), \n запрашивает систему для сброса буфера и подачи данных в scanf . Это должно происходить по умолчанию, если вы ничего не должны делать.

Итак, реальный вопрос: какие данные или символы вам нужны с консоли? В некоторых случаях scanf удаляет scanf пространство и НЕ пропускает пробелы, вкладки, новые строки в вашу программу. Однако scanf может быть закодирован, чтобы НЕ делать это!

Определите, как следует вводить данные, и я могу рассказать вам, как кодировать scanf.