Sprawdzenie zadania w C.

0

Witam, czy mógłby ktoś rzucić okiem na kod i sprawdzić, czy zrobiłem dobrze zadanie?
Zadanie wyglądało następująco:
Zrobić dwie tablice znakowe o długości 50, do pierwszej wpisać 10 znakow, przepisać łancuch znaków z tablicy 1, do tablicy 2 wspak, policzyć z ilu słów składa się łancuch znaków w tablicy 2, porównać tablice funkcją strncmp() i wypisać oba łancuchy na ekranie.
Przyznam się, że kod pisałem trochę z głowy, trochę przy pomocy internetu, dlatego więc pytam, czy wszystko jest okej, żeby nie było tak, że na pierwszy rzut oka program działa, a w kodzie popisane są bzdury.

#include <stdio.h>
#include <stdlib.h>
#define ROZMIAR 50

int main() {
	char array1[ROZMIAR];
	char array2[ROZMIAR];
	int index, i, arraySize;

	printf("Podaj znaki: ");
	for(index = 0; index < 10; index++){
		scanf(" %c", &array1[index]);
	}
	printf("Odczytane wyniki to: ");
	for(index = 0; index < 10; index++){
		printf("%c ", array1[index]);
	}
	/* punkt pierwszy */
	
	printf("\nOdwrocona tablica: ");
	for(i = index - 1; i >= 0; i--){
		printf("%c ", array1[i]);
	}	
	/* punkt drugi */
	arraySize = sizeof(array2);
	printf("\nLancuch w tablicy drugiej sklada sie z %d znakow\n", arraySize);
	
	/* punkt trzeci - zle */
	
	if( strcmp( array1, array2 ) == 0 ){
         printf("Badane lancuchy znakow sa rowne.\n");
    }
    else{
         printf("Badane lancuchy znakow nie sa rowne.\n");
	}
 	/* punkt czwaty */
 	
 	printf("Tablica pierwsza: ");
 	for(index = 0; index < 10; index++){
		printf("%c ", array1[index]);
	}
	
 	printf("\nTablica druga: ");
 	for(i = index - 1; i >= 0; i--)
		printf("%c ", array1[i]);
	/* punkt piaty - ? */
	return 0;
}
1

https://www.tutorialspoint.com/cprogramming/c_strings.htm - pierwszy akapit.

arraySize = sizeof(array2);

To nie jest długość ciagu a wielkość tablicy array2.

EDIT:
Punkt drugi: https://4programmers.net/Forum/C_i_C++/320958-zliczanie_ilosci_slow?p=1557313#id1557313

1

Rozmiar tablicy w C(Twoja linijka: arraySize = sizeof(array2):

int arr[3] = {1, 2 ,3};
printf("%lu\n", sizeof(arr) / sizeof(arr[0]));  // -> 3
0

Okej, dzięki Panowie. A reszta jest okej? Jak mowiłem, na pierwszy rzut oka działa, ale czy rzeczywiscie tak jest?

1

Jak chcesz wiedzieć czy program dobrze działa i nie pominąłeś żadnego przypadku to napisz testy. To jedyny sposób. Czemu mielibyśmy robić to za ciebie? Im szybciej wejdzie ci w nawyk pisanie testów tym lepiej. Rozwijanie czegokolwiek co ma wiecej niż 200 linijek bez testów to nieporozumienie i prędzej czy później się zemści.

Co do rzeczy stylistycznych:

    for(index = 0; index < 10; index++){
        scanf(" %c", &array1[index]);
    }

Kłuje w oczy takie użycie scanfa. Możesz przecież napisać scanf("%10s", array1) -- wczytaj ciąg niebiałych znaków o rozmiarze max. 10. albo fgets(array1, 10, stdin) - wczytaj linijkę max 10 znaków, albo fread(array1, 1, 10, stdin) - wczytaj do 10 znaków ze standardowego wejścia. To co jest fajne w fread, to jest to, że od razu ci zwróci ile znaków wczytał. Inna sprawa, że ty i tak nie korzystasz z tego, że chyba 10 razy niezależnie obliczasz długość tego ciągu, a potem jeszcze nie wiadomo po co 'sizeof'. Przecież po przejściu pierwszej pętli w zmiennej index masz długość ciągu. Swoją drogą, czy jest powiedziane, że zawsze dostaniesz 10 znaków na wejściu? W realnej sytuacji takie założenie jest raczej absurdalne. Na pewno jeśli upierasz się na sizeof, powinieneś go użyć również w pętlach zamiast 10ki wpisanej z palca.

1
Leno napisał(a):

Okej, dzięki Panowie. A reszta jest okej? Jak mowiłem, na pierwszy rzut oka działa, ale czy rzeczywiscie tak jest?

Kolejne uwagi:

  • zawartość tablica1 ma być w normalnej kolejności a zawartość tablica2 w odwrotnej.
  • masz użyć strncmp() a nie strcmp()

Po uwzględnieniu wszystkiego masz do przepisania 90% kodu.

0
Delor napisał(a):
Leno napisał(a):

Okej, dzięki Panowie. A reszta jest okej? Jak mowiłem, na pierwszy rzut oka działa, ale czy rzeczywiscie tak jest?

Kolejne uwagi:

  • zawartość tablica1 ma być w normalnej kolejności a zawartość tablica2 w odwrotnej.
  • masz użyć strncmp() a nie strcmp()

Po uwzględnieniu wszystkiego masz do przepisania 90% kodu.

No właśnie nie do końca wiedziałem, jak przepisać te wartości wspak, mógłbyś coś podlinkować?
Reczywiście strncmp(), a nie strcmp(), mój błąd :|

1

Użyj lub zaimplementuj strrev().

0

@Delor:

memcpy(array2, array1, 10);
	printf("\nOdwrocona tablica: ");
	printf(" %s ", strrev(array2));	

Czy taki coś jest poprawne? Bo z tego co widzę, to działa.

@Edit

printf("% s ", array1); 

Co z wyświetlaniem tablicy w taki sposób?

1
memcpy(array2, array1, 10);

Przy kopiowaniu pamiętaj o '\0'.

strrev(array2) odwraca ciąg w array2 i zwraca wskaźnik na początek (pierwszy element) tego ciągu. Więc:

	printf(" %s ", strrev(array2));	

jest poprawne (odwróci i od razu wypisze).

printf("% s ", array1); 

Co z wyświetlaniem tablicy w taki sposób?

array1 to wskaźnik na początek ciągu więc też zadziała (bez spacji pomiędzy % a s).

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