strcpy tablice

0

Witam, chciałbym poprosić o wyszukanie błędu w poniższym kodzie.
Chodzi o 2 ostrzeżenia wyświetlające się przy okazji funkcji strcpy: ""incompatible implicit declaration of built ..."
oraz dlaczego program podczas wyświetlania pomija mężczyznę (gdy ten jest ostatnią czwartą osobą)

#include <stdio.h>
#define liczba 4 
int main ()
{
	int i;
	char gender[4][20];
	char h[2][20]={"mezczyzna", "kobieta"};
	char plec[4];
	
	for (i=0; i<4; ++i)
	{
		printf ("Podaj plec: ");
		scanf ("%s", &plec[i]);
		if (plec[i] == 'm' || plec[i] == 'M')
		{
			strcpy (gender[i], h[0]);
			printf ("\n%s\n", gender[i]);
			}
			if (plec[i] == 'k' || plec[i] == 'K')
		{
			strcpy (gender[i], h[1]);
			printf ("\n%s\n", gender[i]);
			}
			
		}
	 printf ("Podsumowanie: ");
	 for (i=0; i<4; ++i)
	 {
			printf ("\n%s\n", gender[i]);
			}
	system ("pause");
	return 0;
}

Za pomoc z góry dziękuję.

0

Mógłbyś ładniej formatować kod. Do tego nie definiuj sobie wcześniej i do pętli. Pewnie robiłeś w Pascalu i Ci zostało - lepiej zainicjować lokalnie w petli.
Twoim błedem jest, że wczytujesz to jako pleć jako "%s" czyli jesli dasz m i enter to do chara proboje ci zapisac [c][NULL], bo wszystkie stringi mają na zakonczeniu null'a. Wiec twoj kod dziala np. tak: plec = [m][null][][], potem plec = [m][K][null][], az wkoncu [m][K][m][m]NULL a tu nie ma dla niego miejsca wychodzisz za tablice. Nie za bardzo znam się na C, ale wczytując chara używaj %c. W moim przykladzie jak wpiszesz np. mmmm to wszystko bedzie cacy, jak chcesz obslugiwac enter to dopisz if plec != "\n"

 
#include <cstring>
#include <stdio.h>
#include <stdlib.h>

#define liczba 4 
int main ()
{
        
        char gender[4][20];
        char h[2][20]={"mezczyzna", "kobieta"};
        
 
        for (int i=0; i < 4; ++i)
        {
				char plec;
                printf ("Podaj plec: ");
                scanf ("%c", &plec);
                if (plec == 'm' || plec == 'M')
                {				
                        strcpy (gender[i], h[0]);
                        printf ("\n%s\n", gender[i]);
                 }
                        if (plec == 'k' || plec == 'K')
                {
                        strcpy (gender[i], h[1]);
                        printf ("\n%s\n", gender[i]);
                 }
 
         }

         printf ("Podsumowanie: \n\n");
         for (int i=0; i < 4; ++i)         
                        printf ("\n%s\n", gender[i]);
                        
        system ("pause");
        return 0;
}
0

Kod, który podałeś niestety mi się sypie (korzystam z Dev c++). Mi się udało naprawić używając getchar () zamiast scanf. No a te ostrzeżenia spowodowane były brakiem biblioteki string.h Dzięki za wsparcie. Ps: Czy mógłbyś mi powiedzieć o co ci chodziło z tą czytelnością kodu?

#include <stdio.h>
#include <string.h>
int main ()
{
        int i;
        char gender[4][20];
        char h[2][20]={"mezczyzna", "kobieta"};
        char plec[4];
 
        for (i=0; i<4; ++i)
        {
                printf ("Podaj plec: ");
                plec[i]=getchar();
                getchar();
                if (plec[i] == 'm' || plec[i] == 'M')
                {
                        strcpy (gender[i], h[0]);
                        printf ("\n%s\n", gender[i]);
                        }
                        if (plec[i] == 'k' || plec[i] == 'K')
                {
                        strcpy (gender[i], h[1]);
                        printf ("\n%s\n", gender[i]);
                        }
 
                }
         printf ("Podsumowanie: ");
         for (i=0; i<4; ++i)
         {
                        printf ("\n%s\n", gender[i]);
                        }
        system ("pause");
        return 0;
}

1

Apropos jeszcze tego co powodowało błąd w pierwotnej wersji:

Utworzyłeś za małą tablicę plec[4], i podczas odczytu ostatniego znaku od użytkownika znak zerowy lądował poza tablicą.
Jednak w tej sytuacji nie trafiał on na niewłaściwy obszar pamięci, ale tablicę gdzie rezydowały napisy mezczyzna i kobieta!
Efektem tego było nadpisanie pierwszego znaku co skutkowało modyfikacją pierwszego napisu na \0ezczyzna''. Z racji że strcpy` kopiuje cstringi klasycznie, to jest do znaku zerowego, to nic nie było kopiowane poza wspomnianym znakiem zerowym.

0
ZiomZiom napisał(a):

nie definiuj sobie wcześniej i do pętli. Pewnie robiłeś w Pascalu i Ci zostało - lepiej zainicjować lokalnie w petli.
w C zmienne deklaruje się na początku bloku przed pierwszą instrukcją.

ZiomZiom napisał(a):

dopisz if plec != "\n"
"\n", a '\n' to dwa różne literały, które mylisz.

ZiomZiom napisał(a):
 
#include <cstring>
#include <stdio.h>
#include <stdlib.h>

mieszasz nagłówki c z c++.

ZiomZiom napisał(a):

Nie za bardzo znam się na C
to po co udzielasz rad na temat dobrego stylu programowania w języku, którego nie znasz? Nie żebym się czepiał ale wprowadzasz większy zamęt do kodu niż autor wątku :]

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