Aus einem String alle Leerzeichen entfernen

neuesich

Mitglied
Code:
#include <stdio.h>

char *eraseAllBlanks(char *str)
{
    char *temp;

    while (*str!='\0'){
        while(*str=' ')
            str++;
        *temp=*str;
        temp++;
        str++;
    }
    return temp;
}

void main (void)
{
    char *in="Hallo Welt   ";
    printf("%s", eraseAllBlanks(in));
}
Das war meine Überlegung wie ich aus einem String alle Leerzeichen entfernen könnte, allerdings funktioniert es nicht. Ich habe auch keine Compilerwarnungen, weshalb ich dachte ich frag einfach mal nach. Wahrscheinlich habe ich das mit der Char-Zeiger Syntax noch nicht verstanden^^

Danke für jeden Hinweis!
 
Im main() in Zeile 19 erstellst du einen char-Zeiger, der auf einen konstanten String zeigt. Es wird also automatisch vom Compiler Speicher reserviert, in diesen Speicher wird "Hallo Welt " reingeschrieben und dein char-Zeiger zeigt auf diese Konstante. Das ist aber wie schon erwähnt ein konstanter String -> du darfst ihn nicht ändern. Das machst du aber in der Funktion eraseAllBlanks().
Außerdem erstellst du in der Funktion ein char* temp. In Zeile 10 änderst du den Wert, auf den temp zeigt. Nur wohin zeigt temp? Irgendwohin -> Du änderst irgendeinen Speicher ab, ein weiterer Grund, warum das Programm abstürzt.

Du könntest die Sache mit einem Array in main() statt mit einem Zeiger lösen, oder du reservierst Speicher für den Zeiger mittels malloc() und beschreibst den reservierten Speicher mit "Hallo Welt ".
Dasselbe gilt in der Funtion: temp() muss unbedingt zuerst auf freien Speicher zeigen, sonst darfst du da nichts ändern.

Lg
 
Ok danke fürs bessere Verständnis.

Bei char-Arrays muss ich mich doch immer auf eine feste Größe festlegen, oder? Ich weiß leider nicht wieviele Zeichen eingelesen werden, deshalb hab ich mich für char-Zeiger entschieden.

Aber da habe ich ja das Problem wenn ich mein "temp"-Element erzeuge weiß ich ja nicht wieviel Speicher ich allozieren muss, da ich nicht weiß wie groß der String nach Entfernung der Leerzeichen ist (okay ich könnte eine Funktion erstellen die die Leerzeichen zählt, aber das ist doch übertrieben oder?)
 
Ein char-Pointer und ein char-Array sind eigentlich ziemlich gleich...egal.
tmp der Funktion darfst du so auch nicht verwenden. Kein Speicher angelegt.

Du schreibst, du liest den String ein. Tastatur?

Jedenfalls musst du ihn für die Leerzeichenentfernung den Speicher nicht verkleinern.
Am Schluss sind dann eben ein paar Bytes unbenutzt. Stört doch nicht.
 
Gut. Den String lese ich (später) aus einer Datei (ist aber erstmal nur ein konstanter Wert, um die Funktion umzusetzen)

Wie kann ich denn die Größe eines übergebenen String-Parameters ermitteln? Den muss ich sicherlich der Funktion mit übergeben, oder?
Wenn es keine andere saubere Möglichkeit gibt, dann nehm ich auch ein paar unbenutzte Byte in Kauf;)
 
Du brauchst die Größe in der Funktion nicht (aber du könntest sie mit strlen bekommen).
Mach die Funktion einfach so, dass der leerzeichenlose String da rein kommt,
wo der Ursprüungliche drin war.
Länger kann er ohne Leerzeichen nicht geworden sein, also muss er reinpassen.

Meiner Meinung nach wäre das auch das "sauberste", statt dafür mehrere mallocs zu bemühen.
 
Mach die Funktion einfach so, dass der leerzeichenlose String da rein kommt,
wo der Ursprüungliche drin war.
Länger kann er ohne Leerzeichen nicht geworden sein, also muss er reinpassen.

Meiner Meinung nach wäre das auch das "sauberste", statt dafür mehrere mallocs zu bemühen.
Hm wie ist das wenn ich das erzeugte Element mit dem überschüssigen Bytes erneut einem Element zuordnete (also ein zweites mal malloc verwende, um Speicherplatz zu reservieren)?
Werden da die unnötigen Bytes mitkopiert oder "passt es" dann? Wenn die überschüssigen Bytes nicht mitkopiert werden würden, dann würde ich am Ende der Funktion ein weiteres malloc benutzen...

Code:
#include <stdio.h>

char *eraseAllBlanks(char *str){
    char *runner=str;
    char *temp=(char *)malloc(sizeof(str));

    while (*runner!='\0'){
           while(*runner=' ')
               runner++;
           *temp=*runner;
           temp++;
           runner++;
        }
    return temp;
}

void main (void)
{
    char *in="Hallo Welt   ";
    printf("%s", eraseAllBlanks(in));
}
 
Code:
#include <stdio.h>

char *eraseAllBlanks(char *str){
    char *runner=str;
    char *temp=(char *)malloc(sizeof(str));

    while (*runner!='\0'){
           while(*runner==' ')
               runner++;
           *temp=*runner;
           temp++;
           runner++;
        }
    free(runner);
    return temp;
}

void main (void)
{
    char *in="Ha llo W e lt   ";
    printf("%s", eraseAllBlanks(in));
}
 

Neue Beiträge

Zurück