• 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
56 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 (164,400 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 (164,400 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 (19,350 p.)
@j23, strdup () robi dokładnie to.
1
komentarz 9 czerwca przez j23 Mędrzec (164,400 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ź 219 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
+1 głos
1 odpowiedź 90 wizyt
pytanie zadane 16 kwietnia 2019 w C i C++ przez Neeq Obywatel (1,930 p.)
0 głosów
0 odpowiedzi 675 wizyt
pytanie zadane 8 stycznia 2018 w C i C++ przez BigBuzz Nowicjusz (180 p.)
Porady nie od parady
Forum posiada swój własny serwer Discord, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

85,240 zapytań

134,053 odpowiedzi

297,242 komentarzy

56,328 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.

...