Wie überprüfe ich, ob sich ein Charakter in einem bestimmten Zeichenbereich befindet?

8

C ++: Wie überprüfe ich, ob ein Zeichen zwischen einem bestimmten Zeichenbereich liegt?

Sprich, wenn ich einen String-Namen habe. Ich möchte überprüfen, ob das erste Zeichen dieser Zeichenfolge zwischen 'a' und 'n' liegt.

Wie mache ich das?

To tun (name [0] == 'a') (name [0] == 'b') ... wäre zu lang ...

Wenn möglich, möchte ich eine Lösung, die elegant mit ASCII-Werten umgeht.

    
kingboonz 08.04.2014, 14:25
quelle

6 Antworten

6

Wenn Sie überprüfen möchten, ob das erste Zeichen Ihrer Zeichenfolge zwischen 'a' und 'n' liegt, sollten Sie zum Beispiel name[0] >= 'a' && name[0] <= 'n' korrekt ausführen.

Beachten Sie jedoch, dass Sie, wenn Sie in Ihrem Brief auch Großbuchstaben als erstes Zeichen haben können, stattdessen (name[0] >= 'a' && name[0] <= 'n') || (name[0] >= 'A' && name[0] <= 'N') überprüfen müssen.

    
Dex 08.04.2014, 14:35
quelle
3

Sie können std::all_of in Kombination mit einem Lambda-Ausdruck :

%Vor%

Live-Demo

Dies ist für die meisten Anwendungen portabel genug, da der Zeichensatz normalerweise gemäß den ASCII-Konventionen implementiert wird, wie in § 2.3 / 14 erklärt:

  

Die Glyphen für die Elemente des grundlegenden Quellzeichensatzes sollen Zeichen aus der Teilmenge von ISO / IEC 10646 identifizieren, die dem ASCII-Zeichensatz entspricht. Da das Mapping von Quelldateizeichen auf den Quellzeichensatz (in Übersetzungsphase 1 beschrieben) als implementierungsdefiniert angegeben wird, muss jedoch eine Implementierung dokumentiert werden, in der die grundlegenden Quellzeichen in Quelldateien dargestellt werden.

Die Komplexität des obigen Algorithmus ist O(n) . Die Alternative (überprüfen Sie jedes Zeichen im Zeichenbereich mit k -Zeichen) ist O(n*k) , aber Sie können zumindest sicher sein, dass es keine Implementierung definiert ist.

    
Shoe 08.04.2014 14:46
quelle
2

Wenn Sie sicher sind, dass der verwendete Zeichensatz auf Ihrer Plattform ASCII ist, können Sie etwas wie:

verwenden %Vor%

Ansonsten sollte so etwas funktionieren:

%Vor%     
Sander De Dycker 08.04.2014 14:51
quelle
1

Eine altmodische portable Methode:

%Vor%     
Thomas Matthews 08.04.2014 15:33
quelle
0

Schleife durch die Zeichenfolge, überprüfe jedes Zeichen und schaue, ob es zwischen a und n bleibt, wobei str [i] & gt; 'a' und str [i] & lt; 'n'

verwendet werden     
user3360398 08.04.2014 14:31
quelle
0

Für einen zusammenhängenden Bereich von Zeichen können Sie:

%Vor%

Um Groß- / Kleinschreibung zu berücksichtigen, verwenden Sie tolower() und den Kleinbuchstabenbereich:

%Vor%

Für einen nicht zusammenhängenden Bereich müssen Sie möglicherweise eine Maske erstellen. In diesem Beispiel werde ich nach Vokalen suchen (aus Gründen der Kürze, da es nur 5 gibt, aber jede Kombination in einem Bereich von 32 könnte verwendet werden oder 64 mit einigen Modifikationen ...  tatsächlich würde eine 64-Bit-Maske auf einer 64-Bit-Plattform die Notwendigkeit einer Fallbehandlung eliminieren.

%Vor%

Beachten Sie, dass diese Implementierungen keine Verzweigungen enthalten. Die Verwendung eines unsignierten Vergleichs kann jedoch eine automatische Compiler-Vektorisierung verhindern (Intel-Intrinsics, haben keinen vorzeichenlosen Vergleich) ... wenn das Ihr Ziel ist, können Sie stattdessen 2 & ed-Vergleiche verwenden. Diese Methode funktioniert möglicherweise nicht auf Nicht-ASCII-Systemen, abhängig vom Abstand der Zeichen.

GCC

%Vor%

Clang

%Vor%

ICC

%Vor%

Zusätzlich zur standardmäßigen stackoverflow-Lizenz wird dieser Code für die Public Domain freigegeben

    
technosaurus 21.02.2018 22:58
quelle

Tags und Links