Prüfen, ob char* schon in einer Liste ist

TimN

Erfahrenes Mitglied
Hallo,

ich habe eine Funktion geschrieben, mit der ich überprüfen will, ob ein char* String schon in einer liste vorhanden ist.

Code:
char *namelist[100];
char *name;
int v_count; //anzahl der elemente in namelist

Und hier die Funktion:
Code:
bool ValueExists(char *name)
{
    for(int i = 0; i < v_count; i++)
    {
        printf("Prüfe %s mit %s\n", name, namelist[i]);
        if(strcmp(namelist[i], name) == 0)
            return true;
    }
    return false;
}

Das Problem ist, dass das ganze nicht so funktioniert, wie ich mir es vorstelle....
Wenn ich z.B. folgendes ausführe

Code:
if(ValueExists("test"))
    printf("wert existiert bereits\n");
else
    printf("wert existiert noch nicht\n");
 
if(ValueExists("test2"))
    printf("wert existiert bereits\n");
else
    printf("wert existiert noch nicht\n");

bekomme ich folgende Ausgabe:
wert existiert noch nicht
wert existiert bereits


Stehe ich gerade voll auf dem Schlauch, oder was ist hier los?
 
Hi.

Was genau ist denn dein Problem? Was hast du denn in der Liste gespeichert?

(Und irgendwie vermisse ich die Debugging-Ausgabe vom printf in der ValueExists Funktion. Und irgendwie hast du die return Statements mit dem Return-Wert zusammengeschrieben - Tippfehler?)

Gruß
 
Nein, die Liste ist leer. Aber sobald ich irgend einen belibigen Wert mit folgender Funktion hinzufüge, ist auf einmal angeblich jeder Wert vorhanden...

Code:
void AddValue(char* name, char *value)
{
    if(v_count < MAX_CONFIG_ELEMENTS)
    {
        namelist[v_count] = name;
        valuelist[v_count] = value;
        printf("Folgender Wert wurde hinzugefügt: %s\n", namelist[v_count]);
        v_count++;
    }
    else
        printf("Der Wert %s kann nicht hinzugefügt werden.\n", name);
    }
 
Hast du die Variable v_count auch mit 0 initialisiert?

In der AddValue Funktion speicherst du direkt den Pointer der als Argument übergeben wurde - dann hast du vermutlich vor dem Aufruf der Funktion extra Speicher für das Element angelegt und mit strcpy o.ä. Funktion den Wert kopiert? Oder vielleicht doch nicht? ;)

Gruß
 
Also zu der 1. Frage:
Ja, ich habe die variable mit 0 initialisiert.

zur 2. Frage:
mmmh, naja, ganz ehrlich: nein...
Wie genau kann ich denn den Speicher anlegen? (Hab' mich von PHP versauen lassen^^)
 
Also am besten wäre es wenn du den Speicher in der Funktion AddValue kopierst. Speicher kannst du in C mit malloc anlegen/allozieren und mit free wieder freigeben. Das heißt also, dass du die ganzen Elemente in der Liste auch wieder mit free freigeben mußt!

Wie es scheint verwendest du C++?! Da gibt es die Operatoren new und delete bzw. new[] und delete[] zur Anforderung/Freigabe von Speicher. Du kannst natürlich auch in C++ malloc/free benutzen - aber bitte nicht mixen (z.B. malloc/delete new/free oder so).
Code:
bool AddValue(const char* name, const char *value)
{
    if(v_count < MAX_CONFIG_ELEMENTS)
    {
        char* n_name = new char[strlen(name)+1];
        char* n_value = new char[strlen(value)+1];
        strcpy(n_name, name);
        strcpy(n_value, value);

        namelist[v_count] = n_name;
        valuelist[v_count] = n_value;
        printf("Folgender Wert wurde hinzugefügt: %s\n", namelist[v_count]);
        v_count++;
    }
    else {
        printf("Der Wert %s kann nicht hinzugefügt werden.\n", name);
        return false;
    }
}

void FreeList() {
    while (v_count-- > 0) {
        delete[] namelist[v_count];
        delete[] valuelist[v_count];
    }
}

Gruß
 
Zurück