Alle Leerzeichen aus String entfernen

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren