Как сделать разбиение строки - PullRequest
0 голосов
/ 11 декабря 2010

Привет, я хотел бы, как сделать разбиение строки в C без #include

Ответы [ 3 ]

1 голос
/ 11 декабря 2010

Множество способов сделать это, которые я просто объясню, а не напишу для вас, поскольку это может быть только домашнее задание (или упражнение по самосовершенствованию, поэтому намерение одинаковое).

  • Либо вы разбиваете строку на несколько строк, которые вы перераспределяете в многомерный массив,
  • или вы просто вырезаете строку на разделителях и добавляете терминал '\ 0', где это необходимо, и просто копируете начальный адрес каждой подстроки в массив указателей.

Подход для разделения одинаков в обоих случаях, но во втором случае вам не нужно выделять какую-либо память (но изменять исходную строку), в то время как в первом вы создаете безопасные копии каждой подстроки .

Вы не были конкретны в разделении, поэтому я не знаю, хотели ли вы вырезать подстроки, отдельный символ или список потенциальных разделителей и т. Д. *

Удачи.

0 голосов
/ 11 декабря 2010

Предполагая, что у меня есть полный контроль над прототипом функции, я бы сделал это (сделайте это единственным исходным файлом ( без # включает ) и скомпилируйте, затем свяжите с остальной частью проекта)

Если #include <stddef.h> является частью «без #include» (но не должно), тогда вместо size_t используйте unsigned long в коде ниже

#include <stddef.h>
/* split of a string in c without #include */
/*
** `predst` destination for the prefix (before the split character)
** `postdst` destination for the postfix (after the split character)
** `src` original string to be splitted
** `ch` the character to split at
** returns the length of `predst`
**
** it is UB if
**     src does not contain ch
**     predst or postdst has no space for the result
*/
size_t split(char *predst, char *postdst, const char *src, char ch) {
    size_t retval = 0;
    while (*src != ch) {
        *predst++ = *src++;
        retval++;
    }
    *predst = 0;
    src++; /* skip over ch */
    while ((*postdst++ = *src++) != 0) /* void */;
    return retval;
}

Пример использования

char a[10], b[42];
size_t n;
n = split(b, a, "forty two", ' ');
/* n is 5; b has "forty"; a has "two" */
0 голосов
/ 11 декабря 2010
  1. найдите точку, которую вы хотите разделить
  2. сделайте два буфера достаточно большими, чтобы содержать данные
  3. strcpy (), или сделайте это вручную (см. Пример)

в этом коде я предполагаю, что у вас есть строка str [] и вы хотите разделить ее на первую запятую:

for(int count = 0; str[count] != '\0'; count++) {
    if(str[count] == ',')
        break;
}

if(str[count] == '\0')
    return 0;

char *s1 = malloc(count);
strcpy(s1, (str+count+1));                        // get part after

char *s2 = malloc(strlen(str) - count);           // get part before
for(int count1 = 0; count1 < count; count1++)
    s2[count1] = str[count1];

получил?;)

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