Ich parse einen String (a char*) und ich benutze sscanf um Zahlen aus der Zeichenfolge in Doubles zu zerlegen, wie folgt:
// char* expression;
double value = 0;
sscanf(expression, "%lf", &value);
Das funktioniert super, aber ich würde den String dann gerne mit konventionellen Mitteln parsen. Ich muss wissen, wie viele Zeichen analysiert wurden sscanf damit ich meine manuelle Analyse ab dem neuen Offset fortsetzen kann.
Offensichtlich wäre der einfachste Weg, die Anzahl der Zeichen irgendwie zu berechnen sscanf parst, aber wenn es keine einfache Möglichkeit gibt, ich bin offen für alternative Double-Parsing-Optionen. Allerdings verwende ich derzeit sscanf weil es schnell, einfach und lesbar ist. In jedem Fall brauche ich nur eine Möglichkeit, das Double auszuwerten und danach weiter zu analysieren.
hmjd
Sie können den Formatbezeichner verwenden %n und zusätzlich liefern int * Argument zu sscanf():
int pos;
sscanf(expression, "%lf%n", &value, &pos);
Beschreibung für den Formatbezeichner n aus dem C99-Standard:
Es wird kein Input verbraucht. Das entsprechende Argument soll ein Zeiger auf eine vorzeichenbehaftete Ganzzahl sein, in die die Anzahl der Zeichen geschrieben werden soll, die bisher durch diesen Aufruf von aus dem Eingabestrom gelesen wurden fscanf Funktion. Ausführung einer %n Direktive erhöht nicht den Zuweisungszähler, der nach Abschluss der Ausführung von zurückgegeben wird fscanf Funktion. Es wird kein Argument umgewandelt, aber eines verbraucht. Enthält die Konvertierungsangabe ein zuweisungsunterdrückendes Zeichen oder eine Feldbreite, ist das Verhalten undefiniert.
Überprüfen Sie immer den Rückgabewert von sscanf() um sicherzustellen, dass Zuweisungen vorgenommen wurden und nachfolgender Code nicht fälschlicherweise Variablen verarbeitet, deren Werte unverändert waren:
/* Number of assignments made is returned,
which in this case must be 1. */
if (1 == sscanf(expression, "%lf%n", &value, &pos))
{
/* Use 'value' and 'pos'. */
}
Ich kann es anscheinend nicht zum Laufen bringen Microsoft-Implementierung als solche: sscanf_s(p, "%s %d\n%n", toString, (int)_countof(toString), &itemCount, &pos); Das pos scheint sich gar nicht zu ändern.
– c00000fd
5. November 2017 um 8:00 Uhr
int i, j, k;
char s[20];
if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3)
...something went wrong...
Die Variable k enthält die Zeichenanzahl bis zu dem Punkt, an dem das Ende der Ganzzahl gespeichert ist j wurde gescannt.
Notiere dass der %n wird nicht zu den erfolgreichen Conversions gezählt. Sie können verwenden %n bei Bedarf mehrmals im Formatstring.
13850800cookie-checkAnzahl der von sscanf gelesenen Zeichen abrufen?yes