C mit sscanf Integer oder Floats aus solchen Strings parsen? Siehe Post

Knogle

Lieutenant
Registriert
Mai 2014
Beiträge
696
Ich gruesse euch liebe Community,

Habe nun schon mehrmals mein C Lehrwerk von Dennis Ritchie durch, bin jedoch immernoch am verzweifeln.

Ich habe beispielsweise folgenden String gegeben: "posZ="-7.1" "

Wie kriege ich da den Float rausgezogen? Ich habe viele Moeglichkeiten probiert, beispielsweise das posZ mit string replace zu ersetzen etc. aber die Anfuehrungsszeichen habe ich bisher nicht wegbekommen.

Gibt es die Moeglichkeit mit sscanf oder anders aus diesem oben gegebenen String den Float rauszuparsen?

Ich waere fuer Hilfe dankbar, sscanf finde ich leider super kompliziert, aber vielleicht kennt sich ja jemand von euch damit viel besser aus.

MfG
 
strchr (deinstring, """)
und
strrchr (deinstring, """)
geben 2 Positionen inerhalb des strings zurück. Wie du die Zahl dann mit strstr vollständig extrahierst ist ne Hausaufgabe. Sofern strrchr nicht existiert (K&R....) solltest du das sehr einfach selber implentieren können.
 
Wenn du C++-Funktionen benutzten darfst, dann geht stod (string to double). Bei cplusplus.com kannst du dir die Funktion samt Syntax und Beispiel mal ansehen. Ist ganz elegant für eine Typkonversion.

LG
 
Danke schonmal an euch beiden, werde mal damit rumprobieren.

@Modin666: Ich baue gerade die Funktion strval aus einer C aehnlichen Sprache in C nach, und probiere mal damit :D

Ich breite mein eigentliches Problem mal ein bisschen aus:


Ich habe XML aehnliche Dateien in folgendem Format:

Code:
<map edf:definitions="editor_main">
    <object id="object (BinNt07_LA) (3)" breakable="true" interior="0" alpha="255" model="1337" doublesided="false" scale="1" dimension="0" posX="2503.64844" posY="-1572.14575" posZ="49.1593"></object>
</map>

Kein<xml> oder aehnliches am Anfang, weshalb die Parser damit irgendwie nicht klar kommen.

Weiterhin habe ich keine grosse Ahnung von Binaerbaeumen etc. und da sind XML Parser schon ein richtig starkes Stueck fuer mich und ich auch nach ewigem Nachlesen das Prinzip der XML Parser nicht raffe

Daher versuche ich aus der oben eingefuegten XML damit alle Werte rauszukriegen

Code:
 fscanf(fp, " %*s %*s %s %*s %*s %*s %*s %*s %s  %s %*s %*s %s %s %s %s %s %s %s %d", str1, str2, str3,str4,str5,str6,str7,str8,str9, &a,&b,&c,&d,&e);

Habe dann am Ende einen String mit posX="bla", posY="bla" etc.
Vielleicht kann man das ja noch effizienter loesen
 
nullPtr schrieb:
XML mit scanf und %s parsen? Bitte nicht. Lies K&R nochmal.
Gibt es einen "einfacheren" Weg? :D

Habe hier ein Konstrukt bekommen mit welchem ich schonmal das Attribut object id auslesen kann, jedoch weiss ich nicht wie ich das um modelid, posX, posY etc. erweitern kann

Sowas ist mir leider zu hoch

Code:
#include <stdio.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
 
void walker(xmlNodePtr cur,int level) {
  while ( cur != NULL ) {
    printf("%*s%s\n",level*4,"",cur->name);
    if ( xmlStrcmp(cur->name, (const xmlChar *)"object") == 0 ) {
      xmlChar *p = xmlGetProp(cur, (const xmlChar *)"id");
      if ( p ) {
        printf("%*s object ID=%s\n",level*4+4,"",p);
      }
    }
    if ( cur->xmlChildrenNode ) {
      walker(cur->xmlChildrenNode,level+1);
    }
    cur = cur->next;
  }
}
 
void *parseModelFile( const char *filename ) {
    xmlDocPtr doc;
    xmlNodePtr cur;
 
    doc = xmlParseFile(filename);
    if (doc == NULL) return(NULL);
     
    cur = xmlDocGetRootElement(doc);
    if (cur == NULL) {
        fprintf(stderr,"empty document\n");
    xmlFreeDoc(doc);
    return(NULL);
    }
    walker(cur->xmlChildrenNode,0);
    xmlFreeDoc(doc);
    return "";
}
 
int main(int argc, char **argv) {
 #ifdef LIBXML_SAX1_ENABLED
    int i;
    /* COMPAT: Do not genrate nodes for formatting spaces */
    xmlKeepBlanksDefault(0);
 
    for (i = 1; i < argc ; i++) {
    if ( !parseModelFile(argv[i]) ) {
            fprintf(stderr,"Error parsing %s\n",argv[i]);
        }
    }
 
    /* Clean up everything else before quitting. */
    xmlCleanupParser();
#else
    printf(stderr,"LIBXML_SAX1_ENABLED needed\n");
#endif
    return 0;
}
 
So leid es mir tut, aber hier wird niemand für dich Code schreiben. Vor allem deshalb nicht, weil du total unglaubwürdig rüber kommst.
Du behauptest, mehrfach ein "C Lehrwerk von Dennis Ritchie" gelesen zu haben und trotzdem bist du überfragt, wenn du einen Float aus einem String rausparsen sollst und kommentierst den geposteten Code mit: "Sowas ist mir leider zu hoch".
 
Das ist schade

Das hier war das einzige was ich zu binary trees gefunden habe, mehr gabs da drin nicht.

Habe nur gefragt ob jemand das Ding um ein Attribut erweitern kann damit ich nachvollziehen kann wie es fuer die weiteren Attribute geht

Meine Erweiterungsversuche haben kein Ergebnis gebracht.

@Modin66:

Deine Variante hat geklappt!!!! Danke dir
 

Anhänge

  • 20170304_205555.jpg
    20170304_205555.jpg
    1 MB · Aufrufe: 231
Zuletzt bearbeitet:
Zurück
Oben