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

question-closed Witam mam problem odnośnie typów w jezyku c.

Hosting forpsi easy 1 pln
0 głosów
170 wizyt
pytanie zadane 30 kwietnia 2021 w C i C++ przez pawel_000 Początkujący (450 p.)
zamknięte 30 kwietnia 2021 przez pawel_000

Chce zrobic kolejke dla osób.Ten kod wysweitla mi jednie 1 liter. jesli w struct zmienie na char imie[20] lub char* imie to wyswietla problem z n_wsk jesli dodam przed * to wtedy w kolejce wyswietla ostatnie wpisane dane.Z góry dziekuje!
 

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

struct moja_struktura
{
    char imie;
    char nazwisko;
int wartosc ;
struct moja_struktura * nastepny;
};
struct wsk_moja_struktura
{
struct moja_struktura *poczatek , * koniec ;
};

bool dodaj ( struct wsk_moja_struktura *kolejka , int wartosc,char* imie,char* nazwisko )
{
struct moja_struktura * n_wsk = ( struct moja_struktura *)
malloc ( sizeof ( struct moja_struktura ) ) ;

if ( NULL != n_wsk)
{
n_wsk -> wartosc = wartosc ;
n_wsk -> imie = *imie ;
n_wsk -> nazwisko = *nazwisko ;
n_wsk -> nastepny = NULL ;
if ( NULL == kolejka -> poczatek ){
kolejka -> poczatek = kolejka -> koniec = n_wsk ;

}
else
{
kolejka ->koniec -> nastepny = n_wsk ;
kolejka -> koniec = n_wsk ;

return true ;
}

return false ;
}
return true ;
}

bool usun ( struct wsk_moja_struktura *kolejka , int *wartosc,char* imie,char* nazwisko ) {
if ( NULL != kolejka -> poczatek )
{
struct moja_struktura *tmp = kolejka ->poczatek -> nastepny ;
* wartosc = kolejka ->poczatek -> wartosc ;
*imie = kolejka ->poczatek -> imie ;
*nazwisko = kolejka ->poczatek -> nazwisko ;
free (kolejka -> poczatek ) ;
kolejka -> poczatek = tmp ;
if ( NULL == tmp)
kolejka -> koniec = NULL ;
return true ;
}
return false ;
}

void print_kolejka ( struct wsk_moja_struktura kolejka )
{
for (; NULL != kolejka.poczatek ; kolejka . poczatek = kolejka.poczatek -> nastepny ){
                printf ("---------");
            printf ("Imie: %c ", kolejka .poczatek -> imie ) ;
            printf ("Nazwisko: %c ", kolejka .poczatek -> nazwisko ) ;
            printf ("Wiek: %d ", kolejka .poczatek -> wartosc ) ;
            printf ("------------\n") ;

}
}

int main ()
{
struct wsk_moja_struktura kolejka = {NULL , NULL };

int wiek,wybory;
char imie[20];
char nazwisko[20];

start:
printf ("Jaka opcje wybierasz?: \n1:Dodaj do kolejki\n2:Wypisz z kolejki\n3:Usun z Kolejke\n");
scanf("%i",&wybory);
switch (wybory){
case 1:
printf (" Podaj imie : ") ;
scanf("%s",imie);
printf (" Podaj nazwisko : ") ;
scanf("%s",nazwisko);
printf (" Podaj wiek : ") ;
scanf("%i",&wiek);
dodaj(&kolejka,wiek,imie,nazwisko);
goto start;
case 2:
printf (" kolejka elementy : \n") ;
print_kolejka ( kolejka ) ;
goto start;
case 3:
printf (" Usunieto : ") ;
while ( usun (& kolejka , &wiek,imie,nazwisko) )
printf ("Imie: %s Nazwisko: %s Wiek: %d \n", imie,nazwisko,wiek) ;

goto start;
default:
    goto start;
}
return 0;
}

 

komentarz zamknięcia: Problem został rozwiązany
komentarz 30 kwietnia 2021 przez ScriptyChris Mędrzec (190,190 p.)

Proszę umieścić kod w odpowiednim bloczku.

 
2
komentarz 30 kwietnia 2021 przez pawel_000 Początkujący (450 p.)
przywrócone 30 kwietnia 2021 przez pawel_000
Przepraszam za błąd.

1 odpowiedź

+2 głosów
odpowiedź 30 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
wybrane 30 kwietnia 2021 przez pawel_000
 
Najlepsza

Po pierwsze, pola struktury: imie i nazwisko są typu char. To nie ma prawa działać tak jak chcesz...

struct moja_struktura
{
    char imie;
    char nazwisko;
    ...
}

Wskaźnik char* wskazuje na adres pierwszego elementu łańcucha. Taka konstrukcja:

n_wsk -> imie = *imie ;

zapisuje do pola struktury wartość, na którą wskazuje wskaźnik - czyli pierwszą literę.

Nie znam zbytnio C. Ale, pola struktury powinny być typu char*, i powinieneś do nich zapisywać dynamicznie zaalokowaną pamięć. Ewentualnie typem pól, może być też tablica char.

W obu przypadkach, zwykłe przypisanie nie jest dozwolone, musisz zastosować funkcję strcpy/strncpy do przekopiowania łańcucha. Prosty przykład:

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

struct name {
	char first[20];
	char last[20];
};

int main() {
	struct name sara;
	
	strncpy(sara.first, "Jan", 20);
	strncpy(sara.first, "Kowalksi", 20);

	printf("name: %s\n", sara.first);
}

 

komentarz 30 kwietnia 2021 przez pawel_000 Początkujący (450 p.)

Jezeli dodam tylko wielkosc tablicy wskaznik ma bład jesli zmienie go dodajac* program wczytuje dane ale je nadpisuje nowymi.

komentarz 30 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
Obraz jest mało wyraźny (wręcz fatalny), ale napisałem Ci już, że nie możesz tak po prostu przypisać wartości do tablicy charów operatorem '=' ...

Podałem nawet przykład.
komentarz 30 kwietnia 2021 przez pawel_000 Początkujący (450 p.)
Nie przypisuje nic operatorem = tylko scanf. Jesli w moja_struktura ustawie char imie[20] to dla n_wsk -> imie = *imie jest error assignment to expression with array type. Wiem ze string powinien byc w tablicy char tylko nie wiem jak sobie poradzic ze wskaznikiem.
komentarz 30 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)

Napisałem już, że wyrażenie *imie to typ char. To co ty robisz:

n_wsk -> imie = *imie

jest równoznaczne jak byś np. napisał:

n_wsk -> imie = 'a'

Próbujesz przypisać znak, jako wartość dla tablicy.

I to, że wcześniej wykorzystujesz scanf nie ma tu najmniejszego znaczenia.

Wykorzystaj strncpy przy przekopiować do tablicy łańcuch, na którego pierwszy element wskazuje wskaźnik imie.

komentarz 30 kwietnia 2021 przez pawel_000 Początkujący (450 p.)
Dobrze , a jest mozliwosc zorbienia strncpy z scanf?
komentarz 30 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)

Wystarczy, że zamiast:

n_wsk -> imie = *imie ;
n_wsk -> nazwisko = *nazwisko ;

napiszesz:

strcpy(n_wsk->imie, imie);
strcpy(n_wsk->nazwisko, nazwisko);

I już to będzie miało jakiś wymierny sens. Dla printf będziesz musiał jeszcze %c pozamieniać na %s.

Teraz oczywiście inne fragmenty kodu przestaną Ci się kompilować, ale myślę, że już jakoś sobie poradzisz laugh

 

1
komentarz 30 kwietnia 2021 przez pawel_000 Początkujący (450 p.)
Dziekuje! Ratujesz mi ocene :)

Podobne pytania

0 głosów
1 odpowiedź 156 wizyt
pytanie zadane 12 stycznia 2016 w C i C++ przez DamianW Bywalec (2,080 p.)
0 głosów
5 odpowiedzi 314 wizyt
0 głosów
1 odpowiedź 187 wizyt

92,089 zapytań

140,748 odpowiedzi

317,711 komentarzy

61,408 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia w koszyku, uzyskując rabat aż -50% (jeszcze tylko dziś 30.11 z okazji Black Week, a potem będzie to 30%) na bilety w wersji "Standard"! Więcej informacji na temat akademii znajdziecie tutaj. Dziękujemy Sekurakowi za tak fajną zniżkę dla Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 15% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...