Прерывание указателя строки до маркера в c - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть указатель char * c = "Мне нужно сделать - это - сломать".Мне нужно разбить его в соответствии с '-' так, чтобы в каждой итерации я получал выходные данные как "I", затем "I -need", затем "I-need-to" и так далее до всей строки.Любая помощь?

1 Ответ

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

Простой способ - сделать c изменяемым, а не указатель на String Literal .Таким образом, все, что вам нужно сделать, это обработать строку (используя указатель или индекс) и отслеживать, находитесь ли вы в слове или нет в слове.Когда вы нажимаете пробел (или дефис, если избавляетесь от пробелов), если вы находитесь в слове, сохраните текущий символ, перезапишите текущий символ в массиве с помощью '\0', чтобы завершить строку в текущем символе и вывестиЭто.Восстановите текущий символ в массиве и повторяйте до тех пор, пока у вас не закончатся символы, например,

#include <stdio.h>

int main (void) {

    char c[] = "I - need - to - do - this - break", /* an array */
        *p = c;     /* pointer to current char */
    int in = 0;     /* flag for in/out of word */

    while (*p) {    /* loop over each char */
        if (*p == ' ' || *p == '-') {   /* if a space or hyphen */
            if (in) {                   /* if in a word */
                char current = *p;      /* save current char */
                *p = 0;                 /* nul-terminate array at current */
                puts (c);               /* print array */
                *p = current;           /* restore current in array */
                in = 0;                 /* set flag out of word */
            }
        }
        else {          /* otherwise, not a space or hyphen */
            in = 1;     /* set flag in word */
        }
        p++;            /* advance to next char */
    }

    if (in)             /* if in word when last char reached */
        puts (c);       /* output full string */
}

Пример Использование / Вывод

$ ./bin/incremental
I
I - need
I - need - to
I - need - to - do
I - need - to - do - this
I - need - to - do - this - break

ИспользованиеНеизменяемый строковый литерал

Если вы должны использовать неизменяемый Строковый литерал , то подход в значительной степени тот же.Единственное отличие состоит в том, что вы не можете завершить исходную строку равным нулю, поэтому вам остается использовать другой указатель (или индекс) для вывода каждого символа с начала, пока вы не достигнете текущего с помощью putchar (или не получите число символов от * 1020).* и затем копирование в буфер для nul-terminate и вывода всего сразу).Простое зацикливание до достижения тока и использование putchar для вывода примерно так же просто, как для чего-либо еще, например,

#include <stdio.h>

int main (void) {

    char *c = "I - need - to - do - this - break",  /* string literal */
        *p = c;     /* pointer to current char */
    int in = 0;     /* flag for in/out of word */

    while (*p) {    /* loop over each char */
        if (*p == ' ' || *p == '-') {   /* if a space or hypen */
            if (in) {                   /* if in a word */
                char *wp = c;           /* get pointer to start */
                while (wp < p)          /* loop until you reach current */
                    putchar (*wp++);    /* output each char & increment */
                putchar ('\n');         /* tidy up with newline */
                in = 0;                 /* set flag out of word */
            }
        }
        else {          /* otherwise, not a space or hyphen */
            in = 1;     /* set flag in word */
        }
        p++;            /* advance to next char */
    }

    if (in)             /* if in word when last char reached */
        puts (c);       /* output full string */
}

(вывод такой же)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...