Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C]Nie mogę przekazac długiego łancucha znakow do struktury

ShEvU_elektro 15 Cze 2010 01:47 1293 19
  • #1 15 Cze 2010 01:47
    ShEvU_elektro
    Poziom 25  

    Mam taki problem. Otóż stworzyłem funkcję która pobiera dane od user-a (pobor), zapisuje do łańcuchów, a następnie wywołuje funkcję "dodaj" (z parametrami), która dodaje te dane do struktury. Wszystko byłoby by ok gdyby nie fakt że do zmiennej "telefon" moge wpisac maksymalnie 8 znaków :/
    O co tutaj chodzi? Poniżej kod.

    Code:
    #include <stdio.h>
    
    #include <stdlib.h>
    //$$$$$$$$$$$$$$$$$$$$$$--S T R U K T U R A--$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    typedef struct dane *LIST;
    struct dane{                                                                 //$
           struct dane *next;                                                    //$
           char *imie;                                                           //$
           char *nazwisko;                                                       //$
           char *telefon;                                                       //$
                 };                                                              //$
    //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

    void dodaj(LIST hd,char*imie,char*nazwisko,char*telefon){
         
         int licznik={0};
         struct dane* nowy = malloc( sizeof ( struct dane ) ) ;
         struct dane* tmp=hd;
     
         
                   
         while (tmp->next !=NULL){
                                 tmp = tmp->next;
                                 
                                 } 




                       

                        nowy->imie=NULL;
                        nowy->imie=imie; 
                       

                        nowy->nazwisko=NULL;
                        nowy->nazwisko=nazwisko;
                                           
                       
                        nowy->telefon=NULL;
                        nowy->telefon=telefon;
                                           
                        nowy->next=NULL;
                        tmp->next = nowy;
                        tmp=nowy;
         
         };

    void wyswietl (LIST hd){ 
         int licznik={0};
         struct dane* tmp;
         tmp = hd->next; 
         
         if(tmp==NULL){printf("==========Brak danych do wyswietlenia!==========");return;}
         
         do
         {
                       licznik++; 
                         printf("\n%d. ",licznik);
                         printf("%-15s",tmp->imie);
                         printf("%-15s",tmp->nazwisko);
                         printf("%-15s",tmp->telefon);
                         tmp = tmp->next;
                         }
         while(tmp != NULL);
         };

    char pobor(LIST first,int pozycja){
         char *im = malloc(sizeof(char));
         char *naz = malloc(sizeof(char));
         char *tel = malloc(sizeof(char));
       

         
         int wartosc;
         int wartosc2;
         double buf;
         char tn;
         
         
         
         printf("==========Dodawanie danych==========\n");
         printf("Pozycja-> %i\n",pozycja);
       
                               printf("\nPodaj imie=>");
                               gets(im);
                               printf("Podaj nazwisko=>");
                               gets(naz);     
                               printf("Podaj telefon=>");
                               gets(tel);
                               
                               
                                         
                               dodaj(first,im,naz,tel);
                                   
                     
                     printf("Chcesz dodac kolejny element na liste? T/N=>");
                     tn=getche();
         
         printf("\n");
         return tn;
         
         
         }



    //@@@@@@@@@@@@@@@@--G L O W N A  P E T L A--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    int main(int argc, char *argv[])
    {
    char tn,ch;
    int pozycja={0};
    struct dane* pierwszy = malloc( sizeof ( struct dane ) ) ;
           pierwszy->imie = NULL ; //przypisanie do struktury przekazanych zmiennych
           pierwszy->nazwisko = NULL;
           pierwszy->telefon=NULL;
           pierwszy->next = NULL ; //nadajemy nic nie znaczace dane do transpondera
     


    printf("              Ksiazka telefoniczna by Shevu\n");





    do {
       
       
        printf("\nWybierz opcje:\n");
        printf("1. Aby dodac pozycje\n");
        printf("2. Aby usunac pozycje\n");
        printf("3. Aby wyswietlic ksiazke\n");
        printf("4. Aby zapisac do pliku\n");
        printf("5. Aby wczytac z pliku\n");
        printf("6. Aby zakonczyc\n");
        printf(">");
        ch = getche();
        printf("\n");

        switch(ch) {
          case '1':
                   while (tn!='N' && tn!='n'){
                                              pozycja++;
                                              tn = pobor(pierwszy,pozycja);                                         
                   
                                              }
            tn=0;
            system("cls");
            break;
          case '2':
            printf("b");
            break;
          case '3':
            wyswietl(pierwszy);
            break;
          case '4':
            printf("d");
            break;
          case '5':
            printf("e");
            break;
       }
      } while(ch != '6');





     
         
      return 0;
    }

    0 19
  • Pomocny post
    #2 15 Cze 2010 07:08
    94075
    Użytkownik usunął konto  
  • #3 15 Cze 2010 09:24
    ShEvU_elektro
    Poziom 25  

    Code:
    typedef struct dane *LIST;
    
    struct dane{                                                                 //$
           struct dane *next;                                                    //$
           char *imie;                                                           //$
           char *nazwisko;                                                       //$
           char *telefon;                                                       //$
                 };


    Do tej struktury moge wpisac max 8 znaków.
    Z tego co mi wiadomo to char *zmienna definiuje nieograniczony łańcuch....

    0
  • Pomocny post
    #4 15 Cze 2010 09:33
    94075
    Użytkownik usunął konto  
  • #5 15 Cze 2010 09:40
    ShEvU_elektro
    Poziom 25  

    Języka C dopiero się ucze, coraz bardziej mnie irytuje, ale chce się go nauczyć.
    Program jest mój własny.
    Ciekawe jak Ty zaczynałeś pisać....pewnie od razu wszystko wiedziałeś......
    Jeśli nie chcesz pomóc, a tylko sobie popisać i pojęczeć jaki to ja głupi jestem to proszę, daruj sobie.

    0
  • Pomocny post
    #6 15 Cze 2010 09:56
    94075
    Użytkownik usunął konto  
  • #7 15 Cze 2010 10:38
    ShEvU_elektro
    Poziom 25  

    Na temat wskaźników trochę wiem, potrafię ich używać. Źle się wcześniej wyraziłem :) wiem że tutaj

    Code:
    char *tel = malloc(sizeof(char));
    "tel" jest wskaźnikiem na pierwszy element łańcucha znaków.
    Problem jest w tym że pierwszy raz używam struktury i nie mam fioletowego pojęcia jak to zrobić. Internet skąpi informacji szczegółowych, bynajmniej mnie nie udało się nic pomocnego w tym temacie znaleźć

    0
  • #8 15 Cze 2010 10:41
    94075
    Użytkownik usunął konto  
  • #9 15 Cze 2010 11:00
    ShEvU_elektro
    Poziom 25  

    Jesteś wielki :) Już wiem o co chodzi :)
    Naprowadziłeś mnie tą wypowiedzią i złapałem się za głowę :)

    Code:
    char *tel = malloc(sizeof(char)*10);


    Teraz definiuje długość łańcucha znaków?
    Hmmmm działa dobrze. Tylko teraz powiedz mi czy to "*10" to jest ilość elementów mojego łańcucha? Bo chciałbym zrozumieć bardzo dokładnie co tutaj się dzieje.

    0
  • #10 15 Cze 2010 11:09
    94075
    Użytkownik usunął konto  
  • #11 15 Cze 2010 11:14
    ShEvU_elektro
    Poziom 25  

    No ok :)
    Bo chcę mieć pewność że przed wpisaniem czegokolwiek będzie to "pusto"

    0
  • Pomocny post
    #12 15 Cze 2010 11:19
    94075
    Użytkownik usunął konto  
  • #13 15 Cze 2010 13:13
    ShEvU_elektro
    Poziom 25  

    Ok, dzięki bardzo za lekcje :)
    Mam jeszcze pytanko, mianowicie czy istnieje w czystym C instrukcja, która zamienia wielkości liter ? Nie mogę się doszukać tego. W Pascalu było coś takiego jak upcase().

    0
  • #14 15 Cze 2010 13:19
    94075
    Użytkownik usunął konto  
  • #15 15 Cze 2010 13:54
    gaskoin
    Poziom 38  

    ShEvU_elektro napisał:

    Code:
    char *tel = malloc(sizeof(char)*10);


    Teraz definiuje długość łańcucha znaków?
    Hmmmm działa dobrze. Tylko teraz powiedz mi czy to "*10" to jest ilość elementów mojego łańcucha? Bo chciałbym zrozumieć bardzo dokładnie co tutaj się dzieje.


    http://en.wikipedia.org/wiki/Malloc

    ta funkcja rezerwuje w pamięci blok danych równy długości tego co wpiszesz jako argument. Tzn jeżeli w tym przypadku masz tam napisane sizeof(char) - oznacza to, że rezerwujesz tyle pamięci ile zajmuje pojedynczy znak (char), jeżeli argumentem będzie 10 * sizeof(char) znaczy to tyle, że rezerwujesz pamięc na 10 znaków. To samo można robić z każdym innym typem.

    0
  • #16 15 Cze 2010 14:04
    ShEvU_elektro
    Poziom 25  

    no właśnie nie do końca bo wpisując sizeof(char)*10 mogę wpisać 17 znaków. Przy 18 się sypie :)

    0
  • Pomocny post
    #17 15 Cze 2010 14:18
    gaskoin
    Poziom 38  

    teoretycznie do char[5] też można wpisać i 20 znaków... Ze wskaźnikami trzeba po prostu uważać, a nie kłócić się, że jak działa tzn że ktoś źle Ci mówi

    niektóre kompilatory nawet pozwalają na coś takiego:

    Code:

    int n;

    scanf("%d",&n);

    char tab[n];


    co też nie jest poprawne - a działa

    0
  • #18 15 Cze 2010 14:20
    ShEvU_elektro
    Poziom 25  

    Ja się nie kłócę tylko śmieszne to trochę. Grunt że działa. Zabezpieczenia i tak zrobię na tyle ile chcę znaków :) Dziękuje Wam Panowie za pomoc :)

    0
  • #19 15 Cze 2010 14:24
    gaskoin
    Poziom 38  

    powinieneś trochę inaczej do tego podejść:

    ponieważ tablica jest dynamiczna, podczas kompilacji kompilator nie jest w stanie stwierdzić jaki będzie jej rozmiar, dlatego pozwala na zapisywanie w obszarach pamięci nie przeznaczonych na dane. Musisz z tym uważać gdyż chociażby po restarcie systemu, już może nie działać do 17, a np do 13, i może nie tylko wysypać Twoja aplikację, ale także przy okazji przypadkiem inną.

    0
  • #20 15 Cze 2010 14:50
    94075
    Użytkownik usunął konto