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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
356 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ź 195 wizyt
pytanie zadane 12 stycznia 2016 w C i C++ przez DamianW Bywalec (2,080 p.)
0 głosów
5 odpowiedzi 427 wizyt
0 głosów
1 odpowiedź 341 wizyt

93,182 zapytań

142,196 odpowiedzi

322,002 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1889p. - dia-Chann
  2. 1864p. - Łukasz Piwowar
  3. 1847p. - CC PL
  4. 1843p. - Łukasz Eckert
  5. 1805p. - Tomasz Bielak
  6. 1785p. - Michal Drewniak
  7. 1777p. - Łukasz Siedlecki
  8. 1774p. - rucin93
  9. 1744p. - rafalszastok
  10. 1724p. - Adrian Wieprzkowicz
  11. 1684p. - Mikbac
  12. 1624p. - Anonim 3619784
  13. 1520p. - Marcin Putra
  14. 1368p. - ssynowiec
  15. 1258p. - Dawid128
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...