Вы можете сделать это с выбранным вами циклом и несколькими условными тестами, которые в основном сводятся к:
- , если текущий символ является разделителем;
- , если предыдущийchar не был разделителем, перед пробелом выведите пробел;
- , если разделитель (текущий символ) не является пробелом, выведите символ char с последующим переводом строки.
(используястрока разделителей в виде строки в strchr
и проверка по текущему символу - это простой способ определить, является ли текущий символ разделителем)
Сложив это вместе в коротком примере, вы могли бы сделать что-то похожее на:
#include <stdio.h>
#include <string.h>
int main (void) {
int c, last = 0; /* current & previous char */
const char *delims = " (){}"; /* delimiters */
while ((c = getchar()) != EOF) { /* read each char */
if (strchr (delims, c)) { /* if delimiter */
if (last && !strchr (delims, last)) /* if last not delimiter */
putchar ('\n'); /* precede char with newline */
if (c != ' ') { /* if current not space */
putchar (c); /* output delimiter */
putchar ('\n'); /* followed by newline */
}
}
else /* otherwise */
putchar (c); /* just output char */
last = c; /* set last to current */
}
}
Пример использования / Вывод
Учитывая вашу входную строку, вывод соответствует тому, что вы предоставили.
$ printf "void statement(int y){" | ./bin/getchar_delims
void
statement
(
int
y
)
{
Посмотрите вещии дайте мне знать, если у вас есть дополнительные вопросы.