mikrocontroller.net

Forum: Compiler & IDEs Alle Leerzeichen aus String entfernen


Autor: Denis Jakel (Firma: FZK) (skywalker1981)
Datum:

Bewertung
0 lesenswert
nicht 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++;
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    buff[j++] = buff[i];
Muss heißen
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
int len = (int)strlen(buff); 
heißen und es ermittelt die Länge des Originalstrings (strlen ist eine 
Funktion aus der string.h)

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was verstehst du denn an der Funktion nicht?
int len = (int)strlen(buf);   // 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 (buff[i] != ' ')   // befindet sich an der aktuellen Position im 
                              // String etwas anderes als ein Leerzeichen?
        {
                buff[j++] = buff[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
}


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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Denis Jakel (Firma: FZK) (skywalker1981)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am Ende der Routine fehlt noch
  buff[j] = '\0';

bzw.
  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:
void strip(char *s) {
  char c, *p=s;

  while((c = *s++))   // Schleife über alle Zeichen des Strings
    if(c != ' ')      // Nur die Nichtleerzeichen ...
      *p++ = c;       // ... werden in den Stringpuffer zurückkopiert
  *p = '\0';          // String mit Nullzeichen abschließen
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.