Wątek przeniesiony 2018-05-26 22:54 z C/C++ przez kq.

Problem z porównywaniem słów w if i drukowaniem zawartości struktury

0

Cześć, mam do zrobienia taki program:
W tablicy struktur mogą być przechowywane informacje o osobach wypożyczających książki z pewnej biblioteki, dla każdej: imię, nazwisko, data, sygnatura książki (liczba).
Program ma: dopisywać inforamcje o kolejnej osobie
znajdować info o osobie zwracającej książkę
usuwać informacje o osobie która tę książkę oddała i robić wydruk tablicy struktur.
Oto co stworzyłem:

#include <stdio.h>
#include <math.h>

struct wypozyczenie {
    char imie[10];
    char nazwisko[10];
    char* data[10];
    int sygnatura;
};

int main()
{
    int i = 0, j = 0, a;
    char imie2[10];

    printf("podaj ile osob chcesz wpisać \n");
    scanf("%d", &j);

    struct wypozyczenie d[j];
    a = j;

    printf("podaj informacje o osobie \n");

    for (i = 0; i < j; i++) {
        printf("imie (maks 10 znakow) \n");
        scanf("%s", &d[i].imie);
        printf("nazwisko (maks 10 znakow) \n");
        scanf("%s", &d[i].nazwisko);
        printf("podaj sygnature ksiazki \n");
        scanf("%d", &d[i].sygnatura);
        printf("podaj date (odzielone kropkami) \n");

        scanf("%s", &d[i].data);

        printf("________________ \n");
    }

    printf("jesli chcesz jeszcze kogos wpisac wcisnij 1, a jesli nie to cokolwiek innego \n");

    scanf("%d", &j);

    switch (j) {
    case 1:

        printf("podaj ile osob chcesz wpisać \n");

        scanf("%d", &j);

        printf("podaj informacje o osobie/osobach \n");

        for (i = 0; i < j; i++) {
            printf("imie (maks 10 znakow) \n");
            scanf("%s", &d[i].imie);
            printf("nazwisko (maks 10 znakow) \n");
            scanf("%s", &d[i].nazwisko);
            printf("podaj sygnature ksiazki \n");

            scanf("%d", &d[i].sygnatura);

            printf("podaj date (odzielone kropkami) \n");

            scanf("%s", &d[i].data);
            printf("________________  \n");
        }
        break;

    default:
        printf("nie chciales nikogo wiecej wpisac \n");
        break;
    }

    system("cls");

    printf("podaj imie osoby oddajacej ksiazke: \n");
    scanf("%s", &imie2);

    for (i = 0; i < a; i++) {
        if (imie2 == *d[i].imie) {
            printf(" %s \n %s \n %s \n %d \n", &d[i].data, &d[i].imie, &d[i].nazwisko, &d[i].sygnatura);
            j = i;
        }
    }
    printf("jesli chcesz skasowac informacje o tej osobie to wcisnij 1, a jesli nie to cokolwiek innego \n");
    scanf("%d", &i);

    switch (i) {
    case 1:
        d[j].data = 0;
        d[j].imie = 0;
        *d[j].nazwisko = 0;
        d[j].sygnatura = 0;
        break;

    default:
        printf("nie chciales usuwac \n");
        break;
    }

    printf("zawartosc tablicy to: \n");
    printf("nr | data | imie | nazwisko | sygnatura | \n");
    for (i = 0; i != a; i++) {
        printf(" %d| %s | %s | %s | %d | \n", i + 1, d[i].data, d[i].imie, *d[i].nazwisko, d[i].sygnatura);
        printf("____ \n");
    }

    return 0;
    getch();
}

Problem jest taki:
tam gdzie jest if i porównanie dwóch imion, kiedy odpalam program tylko prosi o imię, a potem nic nie porównuje, wydruk dziwnie działa i nie wypisuje wszystkich osób. Proszę o pomoc, tylko błagam was: jestem całkiem zielony i nie tłumaczcie mi w stylu "masz UB", albo w jakiś skomplikowany sposób, tylko jak idiocie.
Przepraszam za problem.

Przepraszam jeśli znów źle oznaczyłem program, jest napisane w waszych poradnikach ```, natomiast ja uznałem że to ''', bo wcześniej nigdy ` nie używałem tego symbolu i zauważyłem różnicy, więc ostatnio zaznaczyłem przez ''', a na cpp0x, tagi były [cpp] i [cpp/] więc w pierwszych postach uznałem że tutaj też tak jest, więc jeśli znów jest źle to przepraszam jak to zobaczę to poprawię, nie musicie tego od razu wyrzucać do kosza.

2
  • Do porównywania C-stringów służy strcmp. Pisząc a == b w przypadku C-stringów porównujesz wyłącznie adresy a nie to co się pod nimi znajduje
  • Powtarzasz kod co nie jest fajne.
0

Teraz zminiełem na takie coś aby sprawdzić, czy bez drgiego switcha będzie działać, niestety po wpisaniu drugiego imienia do porównania, pred if, przestaje działać.

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

struct wypozyczenie
{
	char *imie[10]; 
	char *nazwisko[10];
	char *data[10];
	int *sygnatura;
};

int main()
{
	int i=0, j=0, a;
	char imie2[10];
	
	printf("podaj ile osob chcesz wpisać \n");
	scanf("%d", &j);
	
	struct wypozyczenie d[j];
	a=j;
	
	printf("podaj informacje o osobie \n");
	
	for(i=0; i<j; i++)
	{
		printf("imie (maks 10 znakow) \n");
		scanf("%s", &d[i].imie);
		printf("nazwisko (maks 10 znakow) \n");
		scanf("%s", &d[i].nazwisko);
		printf("podaj sygnature ksiazki \n");
		scanf("%d", &d[i].sygnatura);
		printf("podaj date (odzielone kropkami) \n");
	
	scanf("%s", &d[i].data);
	
		printf("________________ \n");
	}
	
//	printf("jesli chcesz jeszcze kogos wpisac wcisnij 1, a jesli nie to cokolwiek innego \n");
	
//	scanf("%d", &j);
	
//	switch(j)
//	{
//		case 1:
//			
//		printf("podaj ile osob chcesz wpisać \n");
		
//	scanf("%d", &j);
	
//	printf("podaj informacje o osobie/osobach \n");
	
//	for(i=0; i<j; i++)
//	{
//		printf("imie (maks 10 znakow) \n");
//		scanf("%s", &d[i].imie);
//		printf("nazwisko (maks 10 znakow) \n");
	//	scanf("%s", &d[i].nazwisko);
	//	printf("podaj sygnature ksiazki \n");
		
	//	scanf("%d", &d[i].sygnatura);
		
//	printf("podaj date (odzielone kropkami) \n");
	
//	scanf("%s", &d[i].data);
	//	printf("________________  \n");
//	}
//	break;
	
//	default: printf("nie chciales nikogo wiecej wpisac \n");
//	break;
//}

system("cls");

printf("podaj imie osoby oddajacej ksiazke: \n");
scanf("%s", &imie2[10]);

for(i=0; i<a; i++)
{
	if(strcmp(imie2, *d[i].imie)==0)
		{
		printf(" %s \n %s \n %s \n %d \n", &d[i].data, &d[i].imie, &d[i].nazwisko, &d[i].sygnatura);
		j=i;
		}	
}
printf("jesli chcesz skasowac informacje o tej osobie to wcisnij 1, a jesli nie to cokolwiek innego \n");
scanf("%d", &i);

switch(i)
{
	case 1:
		*d[j].data=0;
		*d[j].imie=0;
		*d[j].nazwisko=0;
		d[j].sygnatura=0;
		break;
		
	default:
		printf("nie chciales usuwac \n");
		break;
}

printf("zawartosc tablicy to: \n");
printf ("nr | data | imie | nazwisko | sygnatura | \n");
for(i=0; i!=a; i++)
{
	printf(" %d| %s | %s | %s | %d | \n", i+1, *d[i].data, *d[i].imie, *d[i].nazwisko, d[i].sygnatura);
	printf("____________________________________ \n");
}

	return 0;
	getch ();
}
0

Ok, zrobione.

1 użytkowników online, w tym zalogowanych: 0, gości: 1