Я прошу прощения за мой ответ :) Никто не должен попробовать это дома.
Чтобы ответить на первую часть вашего вопроса.
A] Как еще улучшить этот код в C (например, переписать его в 1 для цикла).
Сложность этого алгоритма будет зависеть от того, где находится позиция '|' находится в строке, но этот пример работает только для 2 строк, разделенных '|'. Вы можете легко изменить его позже для более чем.
#include <stdio.h>
void splitChar(char *text, char **text1, char **text2)
{
char * temp = *text1 = text;
while (*temp != '\0' && *temp != '|') temp++;
if (*temp == '|')
{
*temp ='\0';
*text2 = temp + 1;
}
}
int main(int argc, char* argv[])
{
char text[] = "monday|tuesday", *text1,*text2;
splitChar (text, &text1, &text2);
printf("%s\n%s\n%s", text,text1,text2);
return 0;
}
Это работает, потому что массивы в стиле c используют нулевой символ для завершения строки. Поскольку инициализация символьной строки с помощью «» добавит нулевой символ в конец, все, что вам нужно сделать, это заменить вхождения «|» с нулевым символом и назначьте другие символьные указатели следующему байту после '|'.
Вы должны обязательно инициализировать исходную символьную строку с помощью [], поскольку это говорит компилятору выделить хранилище для вашего символьного массива, где char * может инициализировать строку в статической области памяти, которую нельзя изменить.