Add pointer array solution.

This commit is contained in:
paulusja committed 2026-11-05 10:35:07 +01:00
1 parent 68c0349f04
commit 5de350b565
3 files changed
+30 -16

No files matched your search

+2
View File
@@ -58,6 +58,8 @@ int main()
printf("\nNach Entfernen:\n");
printNames();
clearArchive();
return EXIT_SUCCESS;
}
+25 -13
View File
@@ -3,7 +3,7 @@
#include <string.h>
#include "namesarchive.h"
static char names[MAX_NAMES][MAX_NAME_LEN];
static char *names[MAX_NAMES];
static unsigned int numberOfNames = 0;
static int findNameIdx(const char *name);
@@ -14,15 +14,18 @@ static int compareNames(const void *arg1, const void *arg2);
// Ist der angegebene Name länger als die zulässige Namenslänge, wird der Name abgeschnitten hinzugefügt. Rückgabe ist dann 1.
int addName(const char *name)
{
if(numberOfNames < MAX_NAMES)
if(name != NULL && numberOfNames < MAX_NAMES)
{
strncpy(names[numberOfNames], name, MAX_NAME_LEN);
names[numberOfNames][MAX_NAME_LEN-1] = '\0';
numberOfNames++;
return 1;
names[numberOfNames] = malloc(sizeof(*name) * (strlen(name) + 1));
if(names[numberOfNames] != NULL)
{
strncpy(names[numberOfNames], name, strlen(name)+1);
numberOfNames++;
return 1;
}
}
else
return 0;
return 0;
}
// Wie addName. Fügt Namen aber direkt sortiert hinzu. Voraussetzung ist ein bereits sortiertes Archiv.
@@ -59,20 +62,20 @@ int findNameIdx(const char *name)
void removeNameByIdx(unsigned int idx)
{
free(names[idx]);
for(unsigned i = idx+1; i < numberOfNames; i++)
{
strncpy(names[i-1], names[i], MAX_NAME_LEN);
names[i-1][MAX_NAME_LEN-1] = '\0';
names[i-1] = names[i];
}
numberOfNames--;
}
int compareNames(const void *arg1, const void *arg2)
{
const char (*name1)[MAX_NAME_LEN] = arg1;
const char (*name2)[MAX_NAME_LEN] = arg2;
const char *name1 = *((const char **)arg1);
const char *name2 = *((const char **)arg2);
return strcmp(*name1, *name2);
return strcmp(name1, name2);
}
// Sortiert die Namen im Archiv aufsteigend.
@@ -88,4 +91,13 @@ void printNames()
{
printf("%s\n", names[i]);
}
}
void clearArchive()
{
for(int i = 0; i < numberOfNames; i++)
{
free(names[i]);
}
numberOfNames = 0;
}
+3 -3
View File
@@ -1,9 +1,6 @@
#ifndef NAMEARCHIVE_H
#define NAMEARCHIVE_H
// Maximale Namenslänge
#define MAX_NAME_LEN 10
// Maximale Anzahl an Namen
#define MAX_NAMES 100
@@ -19,4 +16,7 @@ void sortNames();
// Gibt die Namen zeilenweise aus.
void printNames();
// Gibt Resourcen frei
void clearArchive();
#endif