Frage

Ich versuche, die Koeffizienten von Polynomen aus einem char-Array in einen int-Array
zu setzen Ich habe diese:

char string[] = "-4x^0 + x^1 + 4x^3 - 3x^4";

und kann es durch den Raum in
tokenize -4X ^ 0
x ^ 1 | 4x ^ 3
3x ^ 4

Also ich zu bekommen versuche: -4, 1, 4, 3 in eine int array

 int *coefficient;
 coefficient = new int[counter];

 p = strtok(copy, "  +");
 int a;
 while (p)
 {
  int z = 0;
  while (p[z] != 'x')
   z++;
  char temp[z];
  strncpy(temp[z], p, z);
  coefficient[a] = atoi(temp);
  p = strtok(NULL, "  +");
  a++;
 }

Allerdings bekommen Im einen Fehler, ich * in ein char ein char konvertieren kann nicht auf Strncpy (Temp [z], p, z);

error: invalid conversion from ‘char’ to ‘char*’  
error: initializing argument 1 of ‘char* strncpy(char*, const char*, size_t)’

Was wäre der beste Weg, dies zu tun?

War es hilfreich?

Lösung

Dieses:

strncpy(temp[z], p, z);

Anforderungen sein:

strncpy(temp, p, z);

Aber denken Sie daran, dass strncpy nicht immer die Zeichenfolge Null beenden.

Auch z wird die Länge des Koeffizienten sein, aber Sie müssen ein zusätzliches Byte in dem Puffer für den Null-Terminator.

Update:

Prüfung Ihren Link, habe ich noch einige schwerwiegende Probleme sehen:

  • Sie können nicht verwenden „-“ in strtok weil es die eine in „-4X“ sowie die, die Sie wollen abholen. Ich denke, man sollte nur auf Räume aufgeteilt und behandeln die +/- Operatoren als Token.
  • Die strncpy Funktion lässt die Zeichenfolge un-terminierten, die atoi verursachen kann den falschen Wert zufällig abstürzen oder zu geben. Eine idiomatische Form ist der Terminator manuell zu schreiben, zum Beispiel temp[z] = '\0'.
  • Der Grund Sie keine Ausgangswerte bekommen ist, dass coefficient[a] = zu einem zufälligen Speicher zu schreiben, weil a nicht initialisiert ist.

Andere Tipps

Sie vorbei ein char strncpy:

  strncpy(temp[z], p, z);

Das erste Argument sollte ein char* Zeiger, kein einziger char sein. Was meinen Sie wahrscheinlich zu tun ist:

  strncpy(temp, p, z);

Die anderen Jungs richtig sind über strncpy () 'in Temp ing statt Temp [z].

Ich werde vorschlagen, dass Sie auch die Exponenten auf freie Variable erfassen möchten. Ich beobachte einen impliziten „0x ^ 2“ Begriff, den Sie zu vernachlässigen erscheinen. Wenn die nächste Schritt ist Ihr Polynom für verschiedene Werte von x zu bewerten (oder, schlimmer noch, einen Solver darauf laufen), müssen Sie diese Kräfte kennen.

Diese Art von Lösung kann leicht genug gemacht werden, aber es Beweis gegen zusätzlichen Leerraum zu machen, weißen Raum fehlt und breit genug, um mehrere Operatoren und Variablennamen diese Art von Strategie zunehmend komplexer und schwieriger (Besonders zu handhaben, wenn Sie benötigen haben aussagekräftige Fehlermeldungen, wenn das Parsen ausfällt).

Mir scheint, wäre es einfacher, eine kugelsichere Lösung mit Boost.Regex zu implementieren (oder sogar Boost.Spirit, wenn die Gesamtaufgabe Reihenfolge der Operationen erfordert analysiert werden), die leicht diese Art von Syntaxen mit einem großen handhaben können Maß an Toleranz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top