Úloha 7.4
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C17, ktorý načíta od používateľa počet slov int n (n je
zadané od používateľa)
a ich maximálnu dĺžku int maxLen. Následne program dynamicky alokuje pole reťazcov. Pre každé slovo alokuje novú
dynamickú pamäť pre samotný reťazec ako prvok poľa. Slovo má maximálne dĺžku definovanú používateľom.
Program postupne od používateľa načíta n slov. Po načítaní všetkách slov vypíše načítané slová a ich dĺžky.
Tip
Pre získanie dĺžky reťazcov je možné použiť funkciu strlen z knižnice <string.h>
Príklady vstupov / výstupov programu
Priebeh programu môže byť nasledovný:
Zadajte počet slov: 3
Zadajte maximálnu dĺžku slova: 10
Zadajte slová:
ahoj
programovanie
C
---
Slová a ich dĺžky:
ahoj (4 znaky)
programovanie (13 znakov)
C (1 znak)Rozbaľ pre ukážku riešenia
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n, maxLen;
// Načítanie počtu slov a maximálnej dĺžky slova od používateľa
printf("Zadajte počet slov: ");
scanf("%d", &n);
if (n <= 0) {
printf("Počet slov musí byť kladné číslo.\n");
return 1;
}
printf("Zadajte maximálnu dĺžku slova: ");
scanf("%d", &maxLen);
if (maxLen <= 0) {
printf("Maximálna dĺžka slova musí byť kladné číslo.\n");
return 1;
}
// Alokácia poľa pointerov na reťazce
char **words = (char **)malloc(n * sizeof(char *));
if (words == NULL) {
printf("Nepodarilo sa alokovať pamäť pre pole slov.\n");
return 1;
}
// Načítanie slov od používateľa
printf("Zadajte slová:\n");
for (int i = 0; i < n; i++) {
// Alokácia pamäte pre jednotlivé slovo (s miestom pre '\0')
words[i] = (char *)malloc((maxLen + 1) * sizeof(char));
if (words[i] == NULL) {
printf("Nepodarilo sa alokovať pamäť pre slovo %d.\n", i + 1);
return 1;
}
// Načítanie slova
printf("Slovo %d: ", i + 1);
scanf("%s", words[i]);
}
// Výpis slov a ich dĺžok
printf("---\nSlová a ich dĺžky:\n");
for (int i = 0; i < n; i++) {
printf("%s (%zu znakov)\n", words[i], strlen(words[i]));
}
// Uvoľnenie alokovanej pamäte
for (int i = 0; i < n; i++) {
free(words[i]);
}
free(words);
return 0;
}Vysvetlenie
Vstup od používateľa:
- Používateľ zadáva počet slov (n) a maximálnu dĺžku slova (maxLen).
- Oba vstupy sú validované, aby boli kladné.
Dynamická alokácia:
- Pole words je alokované pre n pointerov na reťazce.
- Pre každý reťazec v poli je alokovaná pamäť veľkosti maxLen + 1 (pre \0).
Načítanie slov:
- Každé slovo je načítané pomocou scanf a uložené v alokovanej pamäti.
Výpis slov a ich dĺžok:
- Funkcia strlen z knižnice <string.h> sa používa na získanie dĺžky reťazca.
Uvoľnenie pamäte:
- Pre každé slovo sa pamäť uvoľní pomocou free, potom sa uvoľní pamäť pre pole pointerov.