Упражнение 1-12. Напишите программу, которая печатает свои входные данные по одному слову в строке
Изучая язык программирования C на языке K&R, я написал код для упражнения 1-12, который, по всей видимости, сработает. Однако мне стало любопытно, как его можно настроить для более длинного ввода, который бы занимал несколько строк. Текущая программа, которую я написал, завершает ввод, как только я нажимаю ввод. Есть ли способ настроить программу таким образом, чтобы ввод прерывался только по желанию, а не символом новой строки? Вот программа, которую я использовал.
#include <stdio.h>
main()
{
int c;
while ((c = getchar()) != EOF)
{
if ( c == ' ' || c == '\n' || c == '\t' || c == '-')
putchar('\n');
else
putchar(c);
}
}
Заранее спасибо.
5 ответов
Ваш код в порядке - проблема в том, что терминал по умолчанию буферизирует весь набранный вами контент, пока вы не нажмете Enter. Затем введенный вами контент фактически записывается в процессы stdin
,
Чтобы делать то, что вы хотите, вы можете просто читать в строках, пока пользователь, например, не напечатает "print". Затем вы можете просмотреть каждый символ массива и сделать то же самое, что вы уже сделали.
Этот псевдо-C-код иллюстрирует, как вы можете решить эту проблему:
for(;;) {
// create a buffer that will hold the entered lines
char* buffer = ...;
// read multiple lines from the terminal until user types "print"
for(;;) {
char* line = readLine();
if(strcmp(line, "print") == 0) {
break;
} else {
// add the entered line to the buffer (null-terminating)
addLineToBuffer(buffer, line);
}
}
// perform your output loop for the characters in the buffer
char* pos = buffer;
while(*pos) {
if (*pos == ' ' || *pos == '\n' || *pos == '\t' || *pos == '-') {
putchar('\n');
} else {
putchar(*pos);
}
++pos;
}
}
Программа будет получать ввод только в том случае, если вы нажмете клавишу ВВОД, так как обычный терминал работает в каноническом режиме. Так что то, что вы просите сделать, не прямо вперед. Тем не менее, вы можете использовать файл для ввода в вашу программу 1:
$./a.out < inputfile
или введите весь текст, используя здесь документ:
$./a.out << _TEXT
type all the
text you want here
and terminate
it with CTRL+D
which sends EOF to your program
or type _TEXT
(1) Я предполагаю, что оболочка в стиле Unix. Windows powershell также предоставляет такие же возможности.
Я просто использовал пробел и табуляцию, но вы можете добавить что-нибудь еще к разделению слов. Этот код гарантирует, что лишние пробелы или табуляции не будут содержать пустых строк.
int c;
while ((c = getchar()) != EOF){
if (c == ' ' || c == '\t'){
putchar('\n');
while ((c = getchar()) == ' ' || c == '\t');
}
putchar(c);
#include <stdio.h>
#define NONBLANK '-'
int main(){
int c,lastc;
lastc = NONBLANK;
while ((c = getchar()) != EOF){
if (c == ' ')
if (lastc == ' ' || lastc == NONBLANK)
;
else
putchar('\n');
else
putchar(c);
lastc = c;
}
}
Я думаю, что это сделает работу, но слабость этого кода заключается в том, что если вы поместите ' ' один или несколько раз в начале строки, он пропустит первую строку.
Этот код ниже работал для меня
int main()
{
int ch;
while ((ch = getchar()) != EOF)
{
if (ch == ' ' || ch == '\t')
{
putchar('\n');
}
else
putchar(ch);
}
}```