Hoofdletterongevoelige tekenreeksvergelijking C++

Ik weet dat er manieren zijn om vergelijkingen te maken met het negeren van hoofdletters, waarbij wordt herhaald door strings of een goedeop SO heeft een andere bibliotheek nodig. Ik moet dit op andere computers zetten waarop het misschien niet is geïnstalleerd. Is er een manier om de standaardbibliotheken te gebruiken om dit te doen? Op dit moment doe ik gewoon…

if (foo == "Bar" || foo == "bar")
{
cout << "foo is bar" << endl;
}
else if (foo == "Stack Overflow" || foo == "stack Overflow" || foo == "Stack overflow" || foo == "etc.")
{
cout << "I am too lazy to do the whole thing..." << endl;
}

Dit zou de leesbaarheid en bruikbaarheid van mijn code drastisch kunnen verbeteren. Bedankt voor het lezen tot hier.


Antwoord 1, autoriteit 100%

strncasecmp

De functie strcasecmp()voert een byte-voor-byte vergelijking uit van de tekenreeksen s1en s2, waarbij de hoofdletters van de tekens worden genegeerd . Het retourneert een geheel getal kleiner dan, gelijk aan of groter dan nul als s1respectievelijk kleiner is dan, overeenkomt met of groter is dan s2.

De functie strncasecmp()is vergelijkbaar, behalve dat deze niet meer dan nbytes van s1en s2


Antwoord 2, autoriteit 41%

meestal is wat ik doe, een versie in kleine letters van de betreffende tekenreeks vergelijken, zoals:

if (foo.make_this_lowercase_somehow() == "stack overflow") {
  // be happy
}

Ik geloof dat Boost heeft ingebouwde kleine conversies, dus:

#include <boost/algorithm/string.hpp>    
if (boost::algorithm::to_lower(str) == "stack overflow") {
  //happy time
}

Antwoord 3, Autoriteit 18%

Waarom maak je niet alles kleine letters en vergelijk dan?

tolower ()

 int counter = 0;
  char str[]="HeLlO wOrLd.\n";
  char c;
  while (str[counter]) {
    c = str[counter];
    str[counter] = tolower(c);
    counter++;
  }
  printf("%s\n", str);

Antwoord 4, Autoriteit 12%

U kunt een eenvoudige functie schrijven om de bestaande string om te zetten naar kleine letters als volgt:

#include <string>
#include <ctype.h>
#include <algorithm>
#include <iterator>
#include <iostream>
std::string make_lowercase( const std::string& in )
{
  std::string out;
  std::transform( in.begin(), in.end(), std::back_inserter( out ), ::tolower );
  return out;
}
int main()
{
  if( make_lowercase( "Hello, World!" ) == std::string( "hello, world!" ) ) {
    std::cout << "match found" << std::endl;
  }
  return 0;
}

Antwoord 5, Autoriteit 12%

Ik heb dit net geschreven, misschien kan het nuttig zijn voor iemand:

int charDiff(char c1, char c2)
{
    if ( tolower(c1) < tolower(c2) ) return -1;
    if ( tolower(c1) == tolower(c2) ) return 0;
    return 1;
}
int stringCompare(const string& str1, const string& str2)
{
    int diff = 0;
    int size = std::min(str1.size(), str2.size());
    for (size_t idx = 0; idx < size && diff == 0; ++idx)
    {
        diff += charDiff(str1[idx], str2[idx]);
    }
    if ( diff != 0 ) return diff;
    if ( str2.length() == str1.length() ) return 0;
    if ( str2.length() > str1.length() ) return 1;
    return -1;
}

Other episodes