Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[c] Problem z kontenerem danych, zapis danych do struktury

05 Apr 2009 18:26 1566 3
  • Level 9  
    Witam.
    Mam problem z zapisywaniem danych do struktury. Nie wiem dlaczego, ale do struktury zapisuje mi się tylko jeden znak z łańcucha. Proszę o podpowiedź, co może być nie tak.
    Code:
    #include <stdio.h>
    
    #include <stdlib.h>
    #include <string.h>
    #define SIZE_T 100

    struct users {
      char user[SIZE_T];
      char path[SIZE_T];
      int add;
    } *list;

    void initiate(int nusers)
    {
      list = malloc(nusers*sizeof(struct users));
      if( list == NULL)
        printf("Nie udalo sie zaalokowac pamieci dla struktury\n");
      list->add = 0;
    }
    void add_user(char *email, char *dir)
    {
      int i = 0;

      while( list[i].add != 0 )
        i++;
      *(list+i)->user = *email;
      *(list+i)->path = *dir;
      printf("Dodano: %s\n", list[i].user);
      list[i].add = 1;
    }
    void print_user()
    {
      int i;

      for(i=1;i<5;i++){
        printf("%s %s\n", list[i].user, list[i].path);
      }
    }

    int main()
    {
      int i;
      char name1[20] = "tomek@tlen.pl", name2[20] = "ajsmen3@wp.pl", name3[20] = "tomek3@tlen.pl", name4[20] = "ajsmen4@wp.pl";
      char name5[20] = "tomek5@tlen.pl";
      char path1[20] = "/cos/dasda/1", path2[20] = "/cos/dasda/2", path3[20] = "/cos/dasda/1", path4[20] = "/cos/dasda/4", path5[20] = "/cos/dasda/5";

     
      initiate(5);
      add_user(name1, path1);
      add_user(name2, path2);
      add_user(name3, path3);
      add_user(name4, path4);
      add_user(name5, path5);
     
      print_user();
      return 0;
    }

    Po skompilowaniu i uruchomieniu otrzymuję:
    Code:
    Dodano: t
    
    Dodano: a
    Dodano: t
    Dodano: a
    Dodano: t
    a /
    t /
    a /
    t /
  • Level 9  
    Rzeczywiście ;-) Wszystko działa jak należy.
    Dziękuję!
  • Helpful post
    VIP Meritorious for electroda.pl
    Masz dwa problemy - błędne pojęcie o łancuchach znakowych w C oraz błędy w priorytetach operatorów.

    Wyrażenie *(lista+i)->user tłumaczy się jako *((lista+i)->user), a więc l-wartością jest tutaj pierwszy znak pola user.

    Wartością wyrażenia *email tak samo jest pierwszy znak napisy wskazywanego przez wskaźnik email.

    Prawidłowo byłoby:
    Code:
    strcpy(list[i]->user, email);
    Oczywiście w wersji produkcyjnej sprawdzałbyś, czy rozmiar napisu jest odpowiedni.

    Pozdrawiam,
    Dr.Vee