Как Spring. Сеть, делающая мою легче жизнь?

Решение:

#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)
6
задан Silvercode 15 October 2008 в 10:54
поделиться

4 ответа

Обратите внимание, что это говорит, что подает легче заявки предприятия.NET. Корпоративные приложения не являются действительно тем же как нормальными приложениями. Они - очень крупномасштабные приложения, требуя разрабатывающий на основе крупной масштабируемости, мобильности и чрезвычайно гибкой конфигурации. Платформы, которые упрощают этот процесс, все еще будут трудными использовать, но являются менее трудными и более надежными, чем выполнение всей той работы с нуля.

Я был бы сомнителен из использования платформы предприятия в 'нормальном' проекте, хотя, поскольку оно, скорее всего, чрезвычайно сверхспроектировано для требований непредприятия и могло закончить тем, что было более трудным, чем кодирование с нуля при том обстоятельстве.

15
ответ дан 8 December 2019 в 03:55
поделиться
  • Это обеспечивает контейнер МОК. Да, использование этого к его полному требует чтения довольно много. То же верно почти для любого мощного инструмента. Если Вы собираетесь использовать LINQ, которому нужно некоторое исследование также - который делает LINQ бесполезный в Вашем представлении?
  • Это обеспечивает полезные служебные классы для различных вещей. Часто это вещи, которые Вы могли бы прокрутить сами при других обстоятельствах.

Теперь, что касается того, почему Вы получаете таинственные ошибки отслеживания стека при компиляции проекта, который использует Spring.NET..., который звучит очень нечетным. Мы должны были бы услышать больше об ошибках знать то, что продолжается.

8
ответ дан 8 December 2019 в 03:55
поделиться

Если Вы не понимаете, Вы, сила не должна использовать пружину.....

Но Spring.NET является хорошей платформой. Это - больше, чем МОК, намного больше.... Если Вы не понимаете внедрение зависимости / МОК или Аспектно-ориентированные Понятия, пружина не может сделать слишком много для Вас, и Вы могли бы также придерживаться сервисных вещей типа локатора и явных блоков попытки/выгоды на всем протяжении Вашего кода....

3
ответ дан 8 December 2019 в 03:55
поделиться

Я соглашаюсь с Вами, что это имеет некоторую кривую обучения, но что один не должен отговаривать никого изучать этот действительно потрясающий инструмент.

1
ответ дан 8 December 2019 в 03:55
поделиться