pointer und strings: Leerzeichen löschen



  • Hallo Jungs (und Mädels),

    folgende Zeichenkette ist in einem String vorhanden:
    (ABSTIMMASS 45.452)

    ich möchte gerne das Maß 45.452 extrahieren.

    (Der Abstand zwischen ABSTIMMASS und der Zahl kann variieren und ich möchte das im Unterprogramm behandeln...)

    mein Ansatz:

    HP:

    ptr_quelle=strstr(kopie_zeile,"(ABSTIMMASS ");//gibt pointer oder NULL-p. zurueck
      if(ptr_quelle!=0)
      {//habe string gefunden :-)
       ptr_quelle=ptr_quelle+strlen("(ABSTIMMASS ");//hinter gefundenem String pos
       pos=ptr_quelle - kopie_zeile ; //errechne pointerpos
    
          abstimmass = string_to_double(kopie_zeile,ptr_quelle);
    ...
    

    UP:

    //usage: double = string_to_double(ganzer_string, suchstring)
    
    #include <stdio.h> 
    #include <ctype.h>
    
    #include "header.h"
    //double string_to_double(char *in, char *ptr_quelle);  
    
    double string_to_double(char *in, char *ptr_quelle) 
    {
     char string[32]; //es kann eine Zahl mit 32 Stellen ausgelesen werden  
     char *p = string;
    
     double value; 
    
     int pos=0;
    
      //blende Leerzeichen nach gesuchtem String aus
      while (*ptr_quelle == ' ')
      {
        *ptr_quelle++;
      }          
    
      // Extrahiere die zahl nach dem suchstring 
      // bis keine Ziffer mehr kommt 
      while (isdigit (*ptr_quelle) || *ptr_quelle == '.'\
           || *ptr_quelle == '+'|| *ptr_quelle == '-')
      {
    
      //kopiere chars nach string        
      *p++ = *ptr_quelle++;
    
      }
    
      // Wandle string in einen double-Wert um 
      // und gebe diesen dann zurück an den Aufrufer       
      sscanf (string, "%lf", &value); 
      return value; 
     }
    

    ...aber das funzt nicht...
    Der Wert wird zwar richtig ausgelesen, aber die Leerzeichen sind noch da...
    hat jemand eine Idee, wo mein Fehler liegt?

    Vorerst mal Dankeschön für Eure Hilfe!

    Krishna



  • Die Funktion string_to_double() kopiert sich die Zahlendarstellung in ein lokales Array und parst den Inhalt dieses Arrays dann als double. Die Originaldaten werden dabei nicht verändert.

    Und wozu der Parameter 'in' der Funktion gut sein soll, ist mir auch schleierhaft - in der Funktion wird er jedenfalls nirgends verwendet.



  • Nimm einfach strtod()

    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
      char *zeile = "(ABSTIMMMASS     -23.765";
      char *strabst, *strwert;
      double abstimmmass;
    
      if ((strabst = strstr(zeile, "(ABSTIMMMASS ")) != 0)
        { strwert = strabst+strlen("(ABSTIMMMASS ");
          abstimmmass = strtod(strwert, 0);
          printf("abstimmmass %f\n", abstimmmass);
        }
        else
          printf("abstimmmass nicht gefunden\n");
    
      getch();
      return 0;
    }
    


  • keksekekse schrieb:

    Nimm einfach strtod()

    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
      char *zeile = "(ABSTIMMMASS     -23.765";
      char *strabst, *strwert;
      double abstimmmass;
    
      if ((strabst = strstr(zeile, "(ABSTIMMMASS ")) != 0)
        { strwert = strabst+strlen("(ABSTIMMMASS ");
          abstimmmass = strtod(strwert, 0);
          printf("abstimmmass %f\n", abstimmmass);
        }
        else
          printf("abstimmmass nicht gefunden\n");
    
      getch();
      return 0;
    }
    

    oder so

    int main()
    {
      char *zeile = "(ABSTIMMMASS     -23.765";
    
      while (*zeile && !isdigit(*zeile) && *zeile != '-')
         zeile++; 
    
      printf("abstimmass: %lf\n", strtod(zeile,0));
    }
    

    🙂



  • es kann sein dass ich mich irre, aber scanf ueberspringt doch auch mehrere spaces wenn es sein muss. koennte nicht auch ein

    scanf("(ABSTIMMASS %d)", &zahl);

    reichen?



  • Im Gegensatz zu printf verwende ich scanf nur ungern (muß wohl am Anfang in der C-Vor-Pointer-Zeit schlechte Erfahrungen damit gemacht haben...)

    Hier habe ich es ausprobiert, das Parsen beschränkt sich im Prinzip auf eine einzige sscanf-Codezeile:

    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      char *zeile = "(ABSTIMMMASS     -23.765"; /* 0 bis * Leerzeichen ok */
      double value; /* (float: scanf "%f", double: scanf "%lf" */
      int rv; /* Anzahl der geparsten Werte */
    
      value = 0;
      rv = sscanf(zeile, "(ABSTIMMMASS %lf", &value); /* rv = 1 */
      printf("rv %u %f\n", rv, value); 
    
      value = 0;
      rv = sscanf(zeile, "(ABSTIMMMASx %lf", &value); /* rv = 0, bricht bei 'x' ab */
      printf("rv %u %f\n", rv, value);
    
      return 0;
    }
    


  • moin.

    Danke erstmal für die Hilfestellungen...

    @Cstoll: ...in ist noch ein Relikt von vorherigen Versuchen hätte es rauslöschen müssen...

    mit strtod habe ich schlechte Erfahrungen gemacht wg. des Lesens vom Exponent wenn der Zahl ein best. Buchstabe folgt.
    -> deswegen die kopiererei in das Array.

    THX
    Krishna


Anmelden zum Antworten