Решение:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char ** split(const char * str, const char * delim)
{
/* count words */
char * s = strdup(str);
if (strtok(s, delim) == 0)
/* no word */
return NULL;
int nw = 1;
while (strtok(NULL, delim) != 0)
nw += 1;
strcpy(s, str); /* restore initial string modified by strtok */
/* split */
char ** v = malloc((nw + 1) * sizeof(char *));
int i;
v[0] = strdup(strtok(s, delim));
for (i = 1; i != nw; ++i)
v[i] = strdup(strtok(NULL, delim));
v[i] = NULL; /* end mark */
free(s);
return v;
}
int main()
{
char ** v = split("bob is great", " ");
for (int i = 0; v[i] != NULL; ++i) {
puts(v[i]);
free(v[i]);
}
free(v);
return 0;
}
Как видите, я добавляю нулевой указатель в конце вектора в виде метки, но его можно легко изменить, чтобы он возвращал количество слов и т. Д.
Выполнение:
bob
is
great
Второе решение с учетом замечаний алка:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char ** split(const char * str, const char * delim)
{
/* count words */
char * s = strdup(str);
if ((s == NULL) /* out of memory */
|| (strtok(s, delim) == 0)) /* no word */
return NULL;
size_t nw = 1;
while (strtok(NULL, delim) != 0)
nw += 1;
strcpy(s, str); /* restore initial string modified by strtok */
/* split */
char ** v = malloc((nw + 1) * sizeof(char *));
if (v == NULL)
/* out of memory */
return NULL;
if ((v[0] = strdup(strtok(s, delim))) == 0) {
/* out of memory */
free(v);
return NULL;
}
size_t i;
for (i = 1; i != nw; ++i) {
if ((v[i] = strdup(strtok(NULL, delim))) == NULL) {
/* out of memory, free previous allocs */
while (i-- != 0)
free(v[i]);
free(v);
return NULL;
}
}
v[i] = NULL; /* end mark */
free(s);
return v;
}
int main()
{
const char * s = "bob is still great";
char ** v = split(s, " ");
if (v == NULL)
puts("no words of not enough memory");
else {
for (int i = 0; v[i] != NULL; ++i) {
puts(v[i]);
free(v[i]);
}
free(v);
}
return 0;
}
Когда из памяти возвращается значение NULL (в предыдущем версия это была строка для разделения), конечно, есть и другие способы сигнализировать, что легко
Выполнение в valgrind:
==5078== Memcheck, a memory error detector
==5078== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==5078== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==5078== Command: ./a.out
==5078==
bob
is
still
great
==5078==
==5078== HEAP SUMMARY:
==5078== in use at exit: 0 bytes in 0 blocks
==5078== total heap usage: 7 allocs, 7 frees, 1,082 bytes allocated
==5078==
==5078== All heap blocks were freed -- no leaks are possible
==5078==
==5078== For counts of detected and suppressed errors, rerun with: -v
==5078== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)
Обратите внимание, что это говорит, что подает легче заявки предприятия.NET. Корпоративные приложения не являются действительно тем же как нормальными приложениями. Они - очень крупномасштабные приложения, требуя разрабатывающий на основе крупной масштабируемости, мобильности и чрезвычайно гибкой конфигурации. Платформы, которые упрощают этот процесс, все еще будут трудными использовать, но являются менее трудными и более надежными, чем выполнение всей той работы с нуля.
Я был бы сомнителен из использования платформы предприятия в 'нормальном' проекте, хотя, поскольку оно, скорее всего, чрезвычайно сверхспроектировано для требований непредприятия и могло закончить тем, что было более трудным, чем кодирование с нуля при том обстоятельстве.
Теперь, что касается того, почему Вы получаете таинственные ошибки отслеживания стека при компиляции проекта, который использует Spring.NET..., который звучит очень нечетным. Мы должны были бы услышать больше об ошибках знать то, что продолжается.
Если Вы не понимаете, Вы, сила не должна использовать пружину.....
Но Spring.NET является хорошей платформой. Это - больше, чем МОК, намного больше.... Если Вы не понимаете внедрение зависимости / МОК или Аспектно-ориентированные Понятия, пружина не может сделать слишком много для Вас, и Вы могли бы также придерживаться сервисных вещей типа локатора и явных блоков попытки/выгоды на всем протяжении Вашего кода....
Я соглашаюсь с Вами, что это имеет некоторую кривую обучения, но что один не должен отговаривать никого изучать этот действительно потрясающий инструмент.