strcmp () aber mit 0-9 NACH A-Z? (C / C ++)

7

Aus Gründen, denen ich völlig widerspreche, aber "Die Mächte (der Anti-Usability), die sein" weiterhin trotz meiner Einwände verordnen, habe ich eine Sortierroutine, die basic strcmp () vergleicht, um nach ihrem Namen zu sortieren. Es funktioniert großartig; es ist schwer, das falsch zu verstehen. In der 11. Stunde wurde jedoch entschieden, dass Einträge, die mit einer Nummer beginnen, nach EINTRÄGEN kommen sollten, die entgegen der ASCII-Reihenfolge mit einem Buchstaben beginnen. Sie zitieren den EBCDIC-Standard hat Zahlen, die Buchstaben folgen, so ist die vorherige Annahme keine universelle Wahrheit, und ich habe keine Macht, dieses Argument zu gewinnen ... aber ich schweife ab.

Darin liegt mein Problem. Ich habe alle geeigneten Verweise auf strcmp durch einen neuen Funktionsaufruf nonstd_strcmp ersetzt und muss nun die Änderungen implementieren, um die Änderung der Sortierung durchzuführen. Ich habe eine FreeBSD-Quelle als Basis verwendet: Ссылка

%Vor%

Ich schätze, ich brauche vielleicht etwas Zeit, um wirklich darüber nachzudenken, wie es gemacht werden sollte, aber ich bin mir sicher, dass ich nicht der Einzige bin, der die hirngängige Veränderung von Spezifikationen vor der Veröffentlichung erlebt hat.

    
Aaron Burke 15.06.2010, 21:18
quelle

6 Antworten

4

In diesem speziellen Fall mit nur Großbuchstaben (wie vom OP in Kommentaren erwähnt) und Ziffern 0-9, könnten Sie auch die Auftragstabelle weglassen und stattdessen beide abweichenden Zeichen mit 4 multiplizieren und vergleichen Die Ergebnisse modulo 256. Der Bereich der ASCII-Ziffern (48 bis 57) wird 8 Bits nicht überschreiten (57 × 4 = 228), aber der Bereich der Großbuchstaben (65 bis 90) wird (65 × 4 = 260). Wenn wir die multiplizierten Werte modulo 256 vergleichen, ist der Wert für jeden Buchstaben kleiner als der einer beliebigen Ziffer: 90 × 4% 256 = 104 & lt; 192 = 48 × 4

Der Code sieht möglicherweise so aus:

%Vor%

Natürlich ist die Auftragstabellen-Lösung im Allgemeinen weitaus vielseitiger, da sie es ermöglicht, eine Sortierreihenfolge für jedes Zeichen zu definieren - diese Lösung ist nur für diesen speziellen Fall sinnvoll, wenn Großbuchstaben Buchstaben gegenüber Ziffern sind . (Aber z. B. auf Microcontroller-Plattformen kann das Speichern sogar der kleinen Menge an Speicher, die von der Tabelle verwendet wird, ein echter Vorteil sein.)

    
Arkku 16.06.2010, 01:22
quelle
16

Was Sie tun müssen, ist eine Bestellungstabelle für jedes Zeichen zu erstellen. Dies ist auch der einfachste Weg, Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen.

%Vor%

Beachten Sie, dass Zeichen möglicherweise signiert sind. In diesem Fall wird der Index für Ihre Tabelle möglicherweise negativ. Dieser Code ist nur für signierte Zeichen verfügbar:

%Vor%     
Mark Ransom 15.06.2010 21:30
quelle
8

Wenn Ihre Kräfte wie alle anderen Kräfte sind, die ich kenne, möchten Sie vielleicht eine Option machen (auch wenn sie versteckt ist):

  

Sortierreihenfolge:

     

o Zahlen nach Buchstaben

     

o Buchstaben nach Zahlen

oder noch schlimmer, sie könnten herausfinden, dass Zahlen numerisch sortiert werden sollen (z. B. "A123" kommt nach "A15"), dann kann es

sein
  

o Zahlen nach Buchstaben

     

o Buchstaben nach Zahlen

     

o Smart Numbers nach Buchstaben

     

o Buchstaben nach intelligenten Zahlen

Das geht dahin, das eigentliche Problem zu diagnostizieren, nicht das Symptom. Ich wette, es besteht eine geringe Chance, dass sie ihre Meinung in der 11. Stunde und 59. Minute ändern können.

    
franji1 15.06.2010 22:12
quelle
5

Sie könnten eine Nachschlagetabelle verwenden, um ASCII in EBCDIC zu übersetzen, wenn Sie Zeichen vergleichen; -)

    
progrmr 15.06.2010 21:20
quelle
3

Obwohl ich generell mit den obigen Antworten einverstanden bin, denke ich, dass es albern ist, Nachschlagevorgänge für jede Iteration der Schleife durchzuführen, es sei denn, Sie denken, dass die meisten Vergleiche unterschiedliche erste Zeichen haben, wenn Sie stattdessen

machen könnten %Vor%

Ich würde auch empfehlen, die order_table mit einem statischen Initialisierer zu konstruieren, was die Geschwindigkeit verbessert (keine Notwendigkeit, jedes Mal zu generieren - oder jemals) und vielleicht auch Lesbarkeit

    
Jared Pochtar 15.06.2010 22:31
quelle
2

Hier ist, was eine sehr gute Implementierung des String-Vergleiches sein sollte, ähnlich wie in anderen Posts beschrieben.

%Vor%

Darüber hinaus könnten Sie die Funktion verallgemeinern, die char_remap_table als Parameter zu verwenden, mit der Sie bei Bedarf später leicht andere Zuordnungen verwenden können.

%Vor%     
nategoose 15.06.2010 22:16
quelle

Tags und Links