Zahlen in Strings=>Vergleich aber ohne atoi
-
Hallo,
muss 2 Strings zahlenwertmäßig vergleichen. In beiden stehen Zahlen drinnen.
Z.B. char* s1="010" und s2="999999999999999999"
s1<s2 soll dabei rauskommen.Auf int konvertieren geht nicht, da auf der Uraltplattform nur maximal long zur Verfügung steht und der hat soweit ich mich erinnere 9 oder 10 Stellen wenn unsigned. Meine Version muss mit zumindest 18 Stellen arbeiten können!
Muss ich mir da jetzt selber eine Vergleichsfunktion schreiben oder gibts da irgendeinen Trick, um doch mit ANSI C Möglichkeiten einfach lösen zu können?
-
Du kannst z.B. alle zu vergleichenden Strings vorne mit '0' auffüllen bis auf einen gemeinsame gleiche Länge und dann mit strcmp vergleichen oder auch mit strtod in double umwandeln und dann vergleichen.
-
Wutz schrieb:
Du kannst z.B. alle zu vergleichenden Strings vorne mit '0' auffüllen bis auf einen gemeinsame gleiche Länge und dann mit strcmp vergleichen oder auch mit strtod in double umwandeln und dann vergleichen.
Werds so machen dass ich vorne mit '0' auffülle und dann strcmp die Arbeit machen lasse!
Danke!
-
Ist sichergestellt, dass die beiden Strings nur Ziffern (0...9) enthalten? Wenn ja, dann zuerst len1=stlen(string1) und len2=strlen(string2) ermitteln und vergleichen. Nur bei Gleichheit ist weiteres erforderlich.
-
shark schrieb:
Nur bei Gleichheit ist weiteres erforderlich.
Da sollte man Nullen wohl überspringen, was?
-
cooky451 schrieb:
shark schrieb:
Nur bei Gleichheit ist weiteres erforderlich.
Da sollte man Nullen wohl überspringen, was?
Vorne JA, weil ohne jede Bedeutung! Es sollen längere Zahlen verglichen werden als durch Umwandlungen in vorhandene Datentypen möglich sind, hier 18 Stellen Integer. Daraus folgt so etwas wie BigInteger oder eben eine zeichenweise Auswertung der beiden Strings.
-
.. .. ich glaube, du hast meinen Beitrag nicht ganz verstanden, das war nur eine Anmerkung zu strlen().
-
Muss ich auch nicht verstehen, wenn ich die gestellte Frage verstanden habe.
Unnütze Querdiskussionen sind sinnlos!
daddeldu!!!
-
Na dann würde ich doch
while (*num1 == '0') ++num1; while (*num2 == '0') ++num2;machen und dann direkt ein strcmp. Vorher noch die strlen zu vergleiche ist doch ineffizient.
-
Das fliegt auseinander, wenn der String nur Nullen beinhaltet. Ich schlage
num1 += strspn(num1, "0");vor.
-
seldon schrieb:
Das fliegt auseinander, wenn der String nur Nullen beinhaltet.
Ups
.Ich schlage
num1 += strspn(num1, "0");vor.
Hervorragend. Manche Funktionen in string.h benutze ich so selten, ihre Existenz ist mir gar nicht bewusst.
-
Danke nochmal für das rege Interesse.
Ich habs nun so implementiert dass die Strings in einen String mit fixer Länge rechtsbündig reinkopiert werden, und die Stellen die links noch frei sind werden mit '0' befüllt.
Danach strcmp und fertig.Mag sein dass es performanter geht, aber ich bin froh wenn es auf dieser mobilen Steinzeit-Plattform läuft und ich da ja nichts mehr nachbessern muss.
-
C Fragender schrieb:
Mag sein dass es performanter geht, aber ich bin froh wenn es auf dieser mobilen Steinzeit-Plattform läuft und ich da ja nichts mehr nachbessern muss.
Zum nicht mehr Nachbessern müssen ist deine Lösung aber denkbar untauglich. Es geht zum Beispiel schon schief, wenn die Zahlen zu lang sind.
-
SeppJ schrieb:
C Fragender schrieb:
Mag sein dass es performanter geht, aber ich bin froh wenn es auf dieser mobilen Steinzeit-Plattform läuft und ich da ja nichts mehr nachbessern muss.
Zum nicht mehr Nachbessern müssen ist deine Lösung aber denkbar untauglich. Es geht zum Beispiel schon schief, wenn die Zahlen zu lang sind.
Nein, es ist eine maximale Länge von 18 definiert. Mehr kopier ich nicht rein in meinen String, zum Absturz kann es nicht kommen.
Wenn wer glaubt er muss längere Strings als 18 über die Schnittstelle übertragen hat er halt Pech gehabt, aber soweits kommts erst gar nicht weil das bereits PC seitig abgefangen wird.
Vertrau mir, das passt schon so
-
Es ist übrigens nicht mal die ganze string.h vorhanden, sondern nur eine abgespeckte Version mit den wichtigsten Funktionen wie strlen und strcmp.
strspn oder strtok gibts zum Beispiel mal garnicht.
-
Naja, das sagst du jetzt. In ein paar Monaten brauchst du soch mal Zahlen mit mehr Stellen und dann kracht's. Bei den anderen Varianten kann da nichts schiefgehen. Funktionen wie strspn sind trivial nach zu programmieren. Im Prinzip hast du es schon, wenn du meinen Vorschlag um die fehlende '\0'-Prüfung erweiterst.
-
SeppJ schrieb:
seldon schrieb:
Das fliegt auseinander, wenn der String nur Nullen beinhaltet.
Ups
.Ich schlage
num1 += strspn(num1, "0");vor.
Hervorragend. Manche Funktionen in string.h benutze ich so selten, ihre Existenz ist mir gar nicht bewusst.
Seid ihr beiden euch tatsächlich sicher , dass jede Bibliotheksfunktion , schneller ist als ne kleine while-Schlaufe :D. Und die meisten Menschen (wie ich) werden beim lesen wahrscheinlich erstmal nachschlagen müssen was strspn() genau macht.
Herzliche Grüße
nt0r
PS:Wenn ihr einen Beweis dafür habt , dass strspn performanter ist , könnte ich den bitte erfahren ?
-
nt0r schrieb:
PS:Wenn ihr einen Beweis dafür habt , dass strspn performanter ist , könnte ich den bitte erfahren ?
Wer hat gesagt, dass es performanter sei? Es ist nur weniger Code und besser zu lesen. Wenn du nicht weißt was Standardfunktionen machen, musst du halt nachgucken.
-
Hmm. Naja es ist Ansichtsache , ob man für sowas eine Funktion aufruft. Ich bin zum Beispiel auch kein wahrer Fan der iostream Bib. Bei der Menge an Speicher die , die frisst

Aber das gehört aber eigentlich nicht zum Thema.
-
Ich sag's mal so: Es gibt Ansichten und es gibt weniger nützliche Ansichten.