структурировать член за символом в c - PullRequest
2 голосов
/ 16 ноября 2010

Как мне присвоить значения элементу структуры символ за символом . Я хотел бы сделать что-то вроде

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct s
{
    char  *z; 
};

int main ()
{

   struct s *ss;
   ss = malloc(2 * sizeof *ss);

   char *str = "Hello World-Bye Foo Bar";
   char *a = str;
   int i = 0;
   while (*a != '\0') {
       if (*a == '-')
           i++;
       else ss[i].z = *a; // can I do this?
       a++;
   }   
   for(i = 0; i<2; i++)
      printf("%s\n",ss[i].z);
}

Так что я могу получить что-то как:

ss[0].z = "Hello World"
ss[1].z = "-Bye Foo Bar"

Редактировать: Забыл упомянуть, число "-" в str может отличаться.

Ответы [ 3 ]

3 голосов
/ 16 ноября 2010

Если const char *str не является константой, вы можете вставить '\0', чтобы разбить строку на две части. При этом вам нужно будет сдвинуть и другие символы в правильное положение.

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

, например

ss[0].z = strdup(str);
ss[1].z = strdup(strchr(str, '-'));
const size_t fist_part = strlen(str)-strlen(ss[1].z);
ss[0].z[first_part] = 0;

Обновление: Вы можете использовать это, даже с более чем одним '-'

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct s
{
    char  *z; 
};

int main ()
{
  struct s *ss;
  ss = malloc(20 * sizeof(struct s));

  const char *str = "Hello World-Bye Foo Bar-more-and-more-things";
  int i = 1;
  char *found = NULL;
  ss[0].z = strdup(str);
  while ((found = strchr(ss[i-1].z, '-'))) {
     // TODO: check found+1 is valid!
     ss[i].z = strdup(found+1);
     *found = 0;
     ++i;
  }   
  for(i = 0; i<6; i++)
     printf("%s\n",ss[i].z);

  return EXIT_SUCCESS;
}

На практике вы хотите быть более осторожными, чтобы избежать ошибок с неожиданным вводом данных, поэтому вы должны быть уверены, что обрабатываете:

  • Там нет '-' символ
  • Символ '\ 0' отсутствует
  • ошибка выделения

Не забудьте free() тоже!

0 голосов
/ 16 ноября 2010

Вам потребуется выделить новые блоки памяти для хранения разделенных строк (по крайней мере, первого).

char *s1, *s2, *a, *b;

const char *str = "Hello World-Bye Foo Bar";

s1 = malloc(strlen(str)+1);
s2 = malloc(strlen(str)+1);

a = str;

int i = 0;
ss[0].z = s1;
b = ss[0].z;
while (*a != '\0') {
    if (*a == '-') {
        i++;
        ss[i].z = s2;
        *b = ss[i].z;
        *b++ = *a;
    } else {
     // s[i].z = *a // can I do this? (yes, but it you might not be happy with the result :-)
        *b++ = *a; // try this instead...
    }
    a++;
}
0 голосов
/ 16 ноября 2010
 else ss[i].z = *a; // can I do this?

Да, вы можете сделать это. НО вам нужно сначала выделить место для каждого z ... и не забывать NUL завершать строки!

ss = malloc(2 * sizeof *ss);
ss[0].z = malloc(1000); /* don't do it */
ss[1].z = malloc(1000); /* like this!  */
...