• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z przesłaniem scanf do funkcji

0 głosów
40 wizyt
pytanie zadane 9 czerwca w C i C++ przez warzywko13 Użytkownik (740 p.)

Witam,

Mam dziwny problem i nie umiem sobie z nim poradzić. Mógłby mi ktoś wytłumaczyć co robię źle. Kod ma tworzyć liste jednokierunkową do której doda parę imion następnie program ma wyświetlić listę i zaraz po tym ją usunąć. Jeśli zamiast scanf zrobię wywołanie ręczne fukcji push_top, np: push_top(&head, "Adam"); push_top(&head, "Maciek"); wszystko działa. Jednak gdy użyję zmiennej w pętli for program wyświetla mi "Maciek Maciek".

Kod:

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

//struktura danych listy
typedef struct ListElement{
   char* data;
   struct ListElement *next;
} List;

//dodawanie elementu do listy
void push_top(List **head, char* data){
   List *current;
   current =(List *)malloc(sizeof(List));

   current->data = data;
   current->next=(*head);
   *head=current;
}

//wyświetlanie listy
void show(List *head){
   List *current=head;

   while (current != NULL){
      printf("%s\n", current->data);
      current = current->next;
   }
}

//usuwanie listy
void remove_list(List *head){
   while(head != NULL){
   	  List *current=head;
      
      current->data = NULL;
      head = current->next;
   }
}

int main (){
   List *head;
   head = (List *)malloc(sizeof(List));
   head=NULL;

   int number;
   printf("Podaj ile imion chcesz podac: ");
   scanf("%d", &number);

   //chyba tu jest błąd
   char yourname[100];
   for(int i=number; i>0; i--){	
   	printf("Podaj imie: ");
   	scanf("%s", yourname);
   	push_top(&head, yourname);
   }
   //chyba tu jest błąd^
   
   show(head);
   remove_list(head);

   return(0);
}

 

1 odpowiedź

+3 głosów
odpowiedź 9 czerwca przez j23 Mędrzec (162,820 p.)
wybrane 9 czerwca przez warzywko13
 
Najlepsza
current->data = data;
current->data = strcpy(malloc(strlen(data) + 1), data);

 

komentarz 9 czerwca przez warzywko13 Użytkownik (740 p.)
Dzięki wielkie. Mógłbyś wytłumaczyć krótko dlaczego tak?
1
komentarz 9 czerwca przez j23 Mędrzec (162,820 p.)

Przypisywałeś wskaźnik do bufora yourname zdefiniowanego w main, ergo: wszystkie elementy wskazywały na ten sam bufor/łańcuch znakowy.

Linia, którą podałem, przydziela pamięć, kopiuje do niej łańcuch znakowy podany w parametrze i przypisuje ją do pola data nowo utworzonej pozycji w liście.

komentarz 9 czerwca przez Oscar Pasjonat (18,590 p.)
@j23, strdup () robi dokładnie to.
1
komentarz 9 czerwca przez j23 Mędrzec (162,820 p.)
Wiem, ale funkcja ta nie jest częścią standardu C (tylko POSIX).
komentarz 9 czerwca przez warzywko13 Użytkownik (740 p.)

@j23, Dzięki jeszcze raz za podzielenie się wiedzą laugh

Podobne pytania

0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
+1 głos
1 odpowiedź 81 wizyt
pytanie zadane 16 kwietnia 2019 w C i C++ przez Neeq Obywatel (1,930 p.)
0 głosów
0 odpowiedzi 647 wizyt
pytanie zadane 8 stycznia 2018 w C i C++ przez BigBuzz Nowicjusz (180 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

83,603 zapytań

132,253 odpowiedzi

291,741 komentarzy

55,204 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...