Разделите строку на более мелкие части и организуйте структуру (C-программирование) - PullRequest
1 голос
/ 08 октября 2009

Я все еще изучаю C, и у меня возникли проблемы с выяснением, как справиться с этим. Ну, у меня есть две структуры:

struct myStruct {
    ...
    struct myString *text[5];
    ...
} allStructs;

struct myString {
    char part[100];
};

Цель состоит в том, чтобы allStruct[n] указывал на 5 различных частей текста, разделенных на строки по 100 символов в каждой. Поэтому я выделяю место:

allStructs = calloc(n, sizeof(allStructs));

Затем предположим, что у меня есть заполненный char text[500], который я хочу разделить на 5 частей, и у меня есть allStructs[n].text[n].part точка в данной части текста. Может ли кто-нибудь помочь мне с тем, как я продолжаю?

Ответы [ 3 ]

1 голос
/ 08 октября 2009

Краткий ответ: вы не можете с этим, потому что вы не учитываете символ \ 0 для завершения каждой строки.

Более длинный ответ: Изменения имеют такую ​​структуру, чтобы иметь больше гибкости:

struct myStruct {
   struct myString *text;
}
struct myString {
   char *part;
}

Распределение должно быть:

struct myStruct *allStruct = calloc(n, sizeof(struct myStruct));

Итак, у вас есть указатель / массив на n struct myStruct.

Затем инициализировать всех членов allStruct;

for( i=0; i<n; ++i )
{
   allStruct[i].text = calloc(5, sizeof(myString));
   // Following for only needed if you want new strings by using the strncpy (see above)
   for( y=0; y<5; ++y )
   {
      allSTruct[i].text[y].part = calloc(101, sizeof(char));
   }
}

Теперь у вас есть все инициализированные переменные.

Чтобы скопировать строку длиной 500 символов в allStruct [n]:

for( i=0; i<5; i++ )
{
   allStructs[n].text[i].part = &text[i*100]; // If you want to point on the existing string
   // OR
   strncpy(allStructs[n].text[i].part, &text[i*100], 100); // If you want to have new strings

   // In all case, terminate the string with '\0'
   allStructs[n].text[i].part[100] = '\0';
}

Это должно сработать.

0 голосов
/ 08 октября 2009

allStructs является объектом типа struct myStruct. Вы не можете «переназначить» его с помощью calloc().

Ваш объект allStructs имеет член text, представляющий собой массив из 5 указателей.
Вам нужно установить эти указатели так, чтобы они указывали на конкретные объекты типа struct myString.

После копирования символов из char text[500] в различные struct myString объекты все будет работать правильно.

псевдокод

struct myString part1;
struct myString part2;
struct myStruct allstructs;
allStructs.text[0] = &part1;
allStructs.text[1] = &part2;
strncpy(part1.part, text, 99);
part1.part[99] = '\0';

printf("part2: %s\n", allStructs.text[1].text);

Oh! И не путайте allStructs (оканчивается на 's') с allStruct (нет 's')

0 голосов
/ 08 октября 2009

Ну, строки c - это просто массив символов, оканчивающийся нулевым символом ('\0'). Таким образом, вы захотите пройтись по большому массиву text[500], поместив 100 символов в каждую из частей myString. Имейте в виду, что, поскольку строки c завершены нулем, вы можете хранить только 99 символов в char part[100].

Также, если вы хотите закончить деталь только символом пробела (пробел (' '), новая строка ('\n') или табуляция ('\t')), вам нужно найти ближайший к Ограничение в 100 символов и разделение строки там.

...