• 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.

Object Storage Arubacloud
0 głosów
224 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ź 163 wizyt
pytanie zadane 12 stycznia 2016 w C i C++ przez DamianW Bywalec (2,080 p.)
0 głosów
5 odpowiedzi 322 wizyt
0 głosów
1 odpowiedź 203 wizyt

92,543 zapytań

141,383 odpowiedzi

319,482 komentarzy

61,929 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich 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 10% 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!

...