3 sätt att jämföra strängar i C++

3 sätt att jämföra strängar i C++

När man programmerar i C++ stöter man ofta på behovet av att jämföra strängar för att kontrollera likhet eller sortera data. C++ tillhandahåller flera sätt att jämföra strängar, och varje metod har sina egna fördelar och nackdelar. I den här artikeln kommer vi att gå igenom de tre vanligaste sätten att jämföra strängar i C++:

* strcmp()-funktionen
* operator==()
* Anpassade jämförelsefunktioner

Introduktion till strängar i C++

Strängar i C++ är samlingar av tecken som avslutas med ett null-tecken ('\0'). De lagras vanligtvis i arrays av tecken, och för att manipulera strängar tillhandahåller C++ ett dedikerat bibliotek som kallas <string>.

När man jämför strängar i C++ är det viktigt att förstå att C++ skiljer mellan små och stora bokstäver i strängar. Det innebär att strängen ”TEST” inte är samma sak som strängen ”test”.

1. strcmp()-funktionen

strcmp()-funktionen är en inbyggd C-funktion som jämför två C-stilsträngar. Den tar två strängpekarparametrar och returnerar ett värde:

* 0 om strängarna är lika.
* Ett positivt värde om den första strängen är större än den andra strängen.
* Ett negativt värde om den första strängen är mindre än den andra strängen.

cpp
#include <cstring>

int main() {
char str1[] = "TEST";
char str2[] = "test";

int result = strcmp(str1, str2);

if (result == 0) {
cout << "Strängarna är lika." << endl;
} else if (result > 0) {
cout << "Sträng 1 är större än sträng 2." << endl;
} else {
cout << "Sträng 1 är mindre än sträng 2." << endl;
}

return 0;
}

Fördelar:

* Enkel att använda.
* Effektiv för stora strängjämförelser.

Nackdelar:

* Känslig för fall.
* Kräver att strängarna avslutas med ett null-tecken.

2. operator==()

Jämförelseoperatorn == i C++ kan också användas för att jämföra strängar. Den tar två string-objekt som parametrar och returnerar true om strängarna är lika, annars false.

cpp
#include <string>

int main() {
string str1 = "TEST";
string str2 = "TEST";

bool result = (str1 == str2);

if (result) {
cout << "Strängarna är lika." << endl;
} else {
cout << "Strängarna är inte lika." << endl;
}

return 0;
}

Fördelar:

* Enkel att använda.
* Oberoende av fall.
* Följer standardoperatorsyntaxen.

Nackdelar:

* Mindre effektiv för stora strängjämförelser jämfört med strcmp().

3. Anpassade jämförelsefunktioner

I vissa fall kan du behöva definiera dina egna anpassade jämförelsefunktioner för att jämföra strängar på ett specifikt sätt. Du kan göra detta genom att skapa en funktion som tar två strängar som parametrar och returnerar ett boolskt värde som anger om strängarna är lika.

cpp
#include <string>

bool caseInsensitiveCompare(string str1, string str2) {
// Konvertera strängarna till gemener för att göra jämförelsen oberoende av fall.
str1 = tolower(str1);
str2 = tolower(str2);

// Jämför de konverterade strängarna med hjälp av operator==().
bool result = (str1 == str2);

return result;
}

int main() {
string str1 = "TEST";
string str2 = "test";

bool result = caseInsensitiveCompare(str1, str2);

if (result) {
cout << "Strängarna är lika, oberoende av fall." << endl;
} else {
cout << "Strängarna är inte lika, oberoende av fall." << endl;
}

return 0;
}

Fördelar:

* Ger maximal flexibilitet för anpassad jämförelselogik.
* Kan användas för att jämföra strängar på ett sätt som inte stöds av de inbyggda jämförelsemetoderna.

Nackdelar:

* Kräver att du skriver din egen jämförelselogik.
* Kan vara mindre effektiv än de inbyggda jämförelsemetoderna.

Slutsats

Att välja rätt metod för att jämföra strängar i C++ beror på de specifika kraven i din applikation. strcmp()-funktionen är ett bra val för snabb och effektiv jämförelse av stora strängar, medan operator==() är bekvämare för att jämföra string-objekt på ett falloberoende sätt. Anpassade jämförelsefunktioner ger dig maximal flexibilitet för att definiera anpassad jämförelselogik, men de kräver att du skriver din egen kod och kan vara mindre effektiva.

Vanliga frågor

1. Vilken är den mest effektiva metoden för att jämföra strängar i C++?

För stora strängjämförelser är strcmp()-funktionen den mest effektiva.

2. Hur jämför jag strängar i C++ utan att vara känslig för fall?

Du kan använda operator==() med strängobjekt eller definiera en anpassad jämförelsefunktion som konverterar strängarna till gemener innan den jämför dem.

3. Hur jämför jag strängar som innehåller specialtecken?

strcmp() och operator==() räknar inte med specialtecken vid jämförelser. Om du behöver jämföra strängar som innehåller specialtecken, kan du definiera en anpassad jämförelsefunktion som tar hänsyn till dem.

4. Kan jag jämföra strängar av olika längder?

Ja, du kan jämföra strängar av olika längder. Jämförelsemetoderna kommer att jämföra gemensamma tecken och ignorera resterande tecken i den längre strängen.

5. Hur hanterar jag null-värden i strängjämförelser?

När du jämför strängar i C++ är det viktigt att kontrollera efter null-värden. Du kan använda strcmp(str1, str2) == 0 för att kontrollera om två strängar är lika (inklusive om de båda är null).

6. Kan jag använda operator==() för att jämföra char*-strängar?

Nej, operator==() kan inte användas direkt för att jämföra char*-strängar. Du måste först konvertera dem till string-objekt.

7. Vilken metod för strängjämförelse ska jag använda när jag sorterar data?

När du sorterar data är det vanligtvis bäst att använda en anpassad jämförelsefunktion som tar hänsyn till sorteringsspecifika krav, såsom sorteringsordning eller specialteckenhantering.

8. Hur kan jag förbättra prestandan för strängjämförelser i C++?

Du kan förbättra prestandan för strängjämförelser genom att använda strcmp() för stora strängar, undvika onödiga strängkopior och använda anpassade jämförelsefunktioner som är optimerade för de specifika kraven i din applikation.