2016-04-24 16 views
-1

Ich versuche, einen cron AusdrucksparserUnerwartete Zeichen beim Drucken char-Array

Ich habe die folgenden Methoden (Work in progress) zu bauen:

Cron parseCron(char* cronStr) { 
    char *dup = strdup(cronStr); 
    char* p; 
    char* cronAtoms[5]; 
    int i = 0; 
    p = strtok(dup, " "); 
    while(p != NULL){ 
    p = strtok(NULL, " "); 
    cronAtoms[i] = p; 
    i++; 

    } 
    return generateCron(cronAtoms); 

} 

und diese ein:

Cron generateCron(char **cronAtoms){ 
    Cron cron; 
    for(int i = 0; i < 5; i++) { 
    printf("%s\n", cronAtoms[i]); 
    } 
    return cron; 
} 

Die Eingabezeichenfolge ist , wenn ich die Ergebnisse hier ausdrucken, was ich bekomme:

* 
* 
* 
* 
@ 

Ich muss zugeben, ich bin ein wenig überrascht, aber ich denke, ich verstehe warum. Der letzte im Array cronAtoms gespeicherte Zeiger kann das abschließende NULL-Zeichen enthalten oder möglicherweise einen Bruch im benachbarten Speicher. Ich bin kein C-Experte, daher ist es durchaus möglich, dass ich mich bei meiner Annahme geirrt habe.

Noch wichtiger ist, ich möchte eine todsichere Methode, richtig wissen, um das letzte Zeichen extrahieren (haben „*“ anstelle von „@“)

+1

überspringen Sie das erste *, weil Sie STRTOK zweimal aufrufen, bevor Sie den Index 0 von cronAtoms setzen. Sie setzen nur die 4 Indizes von cronAtoms. Das @ ist völlig zufällig. Es hätte alles sein können. – Pemdas

+0

... also verschiebe 'p = strtok (NULL," "); zwei Zeilen nach unten, so folgt" i ++; " –

Antwort

0

Ihre Logik ist falsch, die Ihnen offensichtlich gewesen wäre wenn Sie Ihren Code auf Eingaben angewendet hätten, die Felder enthielten, die voneinander unterscheidbar waren. Diese

...

p = strtok(dup, " "); 

... Ergebnisse in p zeigt auf das erste Token in der Zeichenkette. Wenn Sie dann gehen Sie wie Sie tun ...

while(p != NULL){ 
    p = strtok(NULL, " "); 

... zeigen Sie p am nächsten Token, falls vorhanden, die erste zu verlieren.

Dieses Bit ist mehr oder weniger ok ...

cronAtoms[i] = p; 
    i++; 

... aber es schützt nicht die Grenzen des Arrays im Fall gegen Überholkupplung, dass die Eingabe von mehr als fünf Felder hat (nie davon ausgehen, dass Ihre Eingabe gültig ist).

Außerdem Sie nicht initialisieren Elemente cronAtoms, also wenn Sie aus Feldern ausführen, bevor alle von ihnen zuweisen (wie Sie in diesem Fall zu tun, wegen der ersten ignoriert, oder wie Sie vielleicht mit einem ungültigen Eingabe) dann enthalten die ungeschriebenen Elemente Müll, wenn generateCron() sie untersucht.

Nebenbei, strdup() reserviert Speicher, die Sie verpflichtet sind, freizugeben. Wenn Sie dies nicht tun - was Sie nicht tun - dann leckt Ihr Programm diesen Speicher.

Verwandte Themen