Alle Leerzeichen aus String entfernen

OP (Firma: FZK) #845561
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++;
}
>    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)
Gast
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?
OP (Firma: FZK)
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???
Gast
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.