Простой способ - сделать 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 */
}
(вывод такой же)
Просмотрите все и дайтея знаю, если у вас есть вопросы.