Forum: Compiler & IDEs Alle Leerzeichen aus String entfernen


von Denis J. (Firma: FZK) (skywalker1981)


Lesenswert?

Hallo ich habe schon mehrere Beiträge gelesen aber irgendwie check ich 
es nicht richtig. Ich habe eine Variable sting[i] die folgenden in 
Inhalt hat.

Unterstriche sollen Leerzeichen Darstellen!!!

z.B. ___-_001.123 oder ___+001.123

Dann Wandle ich die den String als Float Zahl mit der Funktion
x=atof(string+3);

Durch die (string+3) bekomme ich die Führenden Leerzeichen raus, 
funktioniert bei Positiver Zahl aber bei Negativer Zahl habe ich noch 
ein Leerzeichen zwischen - und 0 was mir viel Ärger bereitet.

Wie bekomme ich alle Leerzeichen in einem string raus???
Habe einen Quellcode im Netz gefunden den ich nicht so richtig 
verstehe...

Kann mir jemand die Funktion erklären, oder irgend wie Helfen das 
Leerzeichen raus zu bekommen???

MfG

Denis

Der Quelltext ist doch Falsch oder???
Wo ist der neue String buff_02 ???


if buff's content is: "he llo wo r ld! how ar e y ou?" then the content 
of buff_02 will be: "helloworld!howareyou?"

#include <string.h>
int i=0, j=0;  //Erzeuge Zwei Zählvaribalen (Integer) i und j
int len = (int)strlen(buf);  // Was macht diese Zeile???
while (i != len)
{
        if (buff[i] != ' ')
        {
                buff[j++] = buff[i];
        }
        i++;
}

von Johannes M. (johnny-m)


Lesenswert?

>    buff[j++] = buff[i];
Muss heißen
1
buff_02[j++] = buff[i];
...und buff und buff_02 müssen natürlich auch vorher deklariert werden, 
aber das ist Dir vermutlich bekannt...

...und das da...
> int len = (int)strlen(buf);  // Was macht diese Zeile???
muss natürlich
1
int len = (int)strlen(buff);
heißen und es ermittelt die Länge des Originalstrings (strlen ist eine 
Funktion aus der string.h)

von STK500-Besitzer (Gast)


Lesenswert?

Was verstehst du denn an der Funktion nicht?
1
int len = (int)strlen(buf);   // Man bestimmt die Länge des Strings
2
while (i != len)              // solange nicht das Ende des Strings erreicht         
3
                              // wurde, soll das folgende ausgeführt werden:
4
{
5
        if (buff[i] != ' ')   // befindet sich an der aktuellen Position im 
6
                              // String etwas anderes als ein Leerzeichen?
7
        {
8
                buff[j++] = buff[i]; // Wenn es kein Leerzeichen ist, wird 
9
                                     // das Zeichen an eine frühere Stelle im 
10
                                     // selben String kopiert.
11
        }
12
        i++;                         // Die Position des zu vergleichenden
13
                                     // Zeichens wird um eine Stelle weiter
14
                                     // zum Ende hin verschoben
15
}


Du solltest das Beispiel einfach mal auf dem Papier durchgehen.


>>    buff[j++] = buff[i];
>Muss heißen

>buff_02[j++] = buff[i];

Sicher?
Kann man sich doch eigentlich auch spanre, oder?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Bei begrenztem Platz kann es Sinn machen in einem Puffer zu arbeiten. 
Wenn ja was entfernt wird, passt das ergebnis immer in den hleichen 
Puffer.. Und wenn es geschickt entfernt wird, wird beim Entfernen nichts 
kaputt geschrieben.

von Johannes M. (johnny-m)


Lesenswert?

@STK500-Besitzer:
Richtig, kann man sich sparen, aber dann stimmt auch noch der Kommentar 
oben drüber nicht mit dem Code überein... Deine Variante ist natürlich 
optimal, wenn der Originalstring verändert werden darf.

von Denis J. (Firma: FZK) (skywalker1981)


Lesenswert?

So ich habe es jetzt abgeändert...


char string[15];
char string_neu[15];
int i;
int j;
double x;

int len = (int)strlen(string);  // Man bestimmt die Länge des Strings
    while (i != len)                // solange nicht das Ende des 
Strings erreicht
                                    // wurde, soll das folgende 
ausgeführt werden:
      {
            if (string[i] != ' ')   // befindet sich an der aktuellen 
Position im
                                    // String etwas anderes als ein 
Leerzeichen?
          {
                string_neu[j++] = string[i]; // Wenn es kein Leerzeichen 
ist, wird
                                     // das Zeichen an eine frühere 
Stelle im
                                     // selben String kopiert.
          }
          i++;                         // Die Position des zu 
vergleichenden
                                     // Zeichens wird um eine Stelle 
weiter
                                     // zum Ende hin verschoben
      }

Leider erhalte ich noch bei Copeilieren folgende fehler....

../290208.c:271: warning: implicit declaration of function 'strlen'
../290208.c:271: warning: incompatible implicit declaration of built-in 
function 'strlen'

Was muss noch declarieren bei strlen???

von Johannes M. (johnny-m)


Lesenswert?

Du hast die string.h nicht eingebunden! Und bitte benutze die 
Formatierungsfunktion für den Code!

von yalu (Gast)


Lesenswert?

Am Ende der Routine fehlt noch
1
  buff[j] = '\0';

bzw.
1
  string_neu[j] = '\0';

um den neu erzeugten String abzuschließen.

Fragt man das Stringende in der While-Schleife ab, kann man nich den
strlen-Aufruf sparen, der den String ebenfalls von vorne nach hinten
abklappert. Manche nehmen lieber Pointer anstelle von
Arrayindizierung (ist aber Geschmacksache). Das Ganze sieht dann, in
eine Funktion verpackt, so aus:
1
void strip(char *s) {
2
  char c, *p=s;
3
4
  while((c = *s++))   // Schleife über alle Zeichen des Strings
5
    if(c != ' ')      // Nur die Nichtleerzeichen ...
6
      *p++ = c;       // ... werden in den Stringpuffer zurückkopiert
7
  *p = '\0';          // String mit Nullzeichen abschließen
8
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.