Разбить массив символов в C, сохраняя разделители - PullRequest
0 голосов
/ 21 февраля 2019

Итак, я работаю в C и у меня есть массив символов, и я хочу разделить его каждый раз, когда есть пробел, "(", ")" или "{".Но я хочу оставить эти разделители символов.Например, если мой ввод был

void statement(int y){

, я бы хотел, чтобы мой вывод был

void statement ( int y ) {

Как лучше всего поступитьэтот?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вы можете попробовать использовать strpbrk, который не только сохраняет символы-разделители, просто возвращая указатель на найденный разделитель, но также поддерживает несколько символов-разделителей.

Например, это должно делать то, что вы хотите:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    char *input = "void statement(int y){a";
    char *delims = " (){";
    char *remaining = input;
    char *token;

     // while we find delimiting characters
    while ((token = strpbrk(remaining, delims)) != NULL) {
         // print the characters between the last found delimiter (or string beginning) and current delimiter
        if (token - remaining > 0) {
            printf("%.*s\n", token - remaining, remaining);
        }

         // Also print the delimiting character itself
        printf("%c\n", *token);

         // Offset remaining search string to character after the found delimiter
        remaining = token + 1;
    }

     // Print any characters after the last delimiter
    printf("%s\n", remaining);

    return 0;
}

Вывод включает пробелы, поскольку вы включили в качестве разделителя.Если вы этого не хотите, оберните печать символов-разделителей следующим образом:

    if (*token != ' ') {
        printf("%c\n", *token);
    }
0 голосов
/ 21 февраля 2019

Вы можете сделать это с выбранным вами циклом и несколькими условными тестами, которые в основном сводятся к:

  1. , если текущий символ является разделителем;
  2. , если предыдущийchar не был разделителем, перед пробелом выведите пробел;
  3. , если разделитель (текущий символ) не является пробелом, выведите символ 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
)
{

Посмотрите вещии дайте мне знать, если у вас есть дополнительные вопросы.

...