Escriba su propio strcmp que ignore los casos

Escriba una función strcmp modificada que ignore los casos y devuelva -1 si s1 < s2, 0 si s1 = s2, de lo contrario devuelve 1. Por ejemplo, su strcmp debería considerar «GeeksforGeeks» y «geeksforgeeks» como la misma string.
Fuente: Conjunto de entrevistas de Microsoft 5 La
siguiente solución supone que los caracteres se representan mediante representación ASCII, es decir, los códigos para ‘a’, ‘b’, ‘c’,… ‘z’ son 97, 98, 99,… 122 respectivamente. Y los códigos para ‘A’, “B”, ‘C’,… ‘Z’ son 65, 66,… 90 respectivamente. 
Los siguientes son los pasos detallados. 
1) Iterar a través de cada carácter de ambas strings y hacer lo siguiente para cada carácter. 
a) Si str1[i] es lo mismo que str2[i], entonces continúe. 
b)Si invertir el sexto bit menos significativo de str1[i] lo hace igual que str2[i], entonces continúe. Por ejemplo, si str1[i] es 65, entonces invertir el sexto bit lo convertirá en 97. Y si str1[i] es 97, entonces invertir el sexto bit lo convertirá en 65. 
c) Si alguna de las dos condiciones anteriores no es cierto, entonces romper. 
2) Compare los últimos (o la primera falta de coincidencia en caso de que no sean iguales) caracteres. 
 

C++

#include <bits/stdc++.h>
using namespace std;
/* implementation of strcmp that ignores cases */
int ic_strcmp(string s1, string s2)
{
    int i;
    for (i = 0; s1[i] && s2[i]; ++i)
    {
        /* If characters are same or inverting the
        6th bit makes them same */
        if (s1[i] == s2[i] || (s1[i] ^ 32) == s2[i])
        continue;
        else
        break;
    }
 
    /* Compare the last (or first mismatching in
    case of not same) characters */
    if (s1[i] == s2[i])
        return 0;
 
    // Set the 6th bit in both, then compare
    if ((s1[i] | 32) < (s2[i] | 32))
        return -1;
    return 1;
}
 
// Driver program to test above function
int main()
{
    cout<<"ret: "<<ic_strcmp("Geeks", "apple") <<endl;
    cout<<"ret: "<<ic_strcmp("", "ABCD")<<endl;
    cout<<"ret: "<<ic_strcmp("ABCD", "z")<<endl;
    cout<<"ret: "<<ic_strcmp("ABCD", "abcdEghe")<<endl;
    cout<<"ret: "<<ic_strcmp("GeeksForGeeks", "gEEksFORGeEKs")<<endl;
    cout<<"ret: "<<ic_strcmp("GeeksForGeeks", "geeksForGeeks")<<endl;
    return 0;
}
 
//This code is contributed by rathbhupendra

C

#include <stdio.h>
 
/* implementation of strcmp that ignores cases */
int ic_strcmp(char *s1, char *s2)
{
    int i;
    for (i = 0; s1[i] && s2[i]; ++i)
    {
        /* If characters are same or inverting the
           6th bit makes them same */
        if (s1[i] == s2[i] || (s1[i] ^ 32) == s2[i])
           continue;
        else
           break;
    }
 
    /* Compare the last (or first mismatching in
       case of not same) characters */
    if (s1[i] == s2[i])
        return 0;
 
    // Set the 6th bit in both, then compare
    if ((s1[i] | 32) < (s2[i] | 32))
        return -1;
    return 1;
}
 
// Driver program to test above function
int main(void)
{
    printf("ret: %d\n", ic_strcmp("Geeks", "apple"));
    printf("ret: %d\n", ic_strcmp("", "ABCD"));
    printf("ret: %d\n", ic_strcmp("ABCD", "z"));
    printf("ret: %d\n", ic_strcmp("ABCD", "abcdEghe"));
    printf("ret: %d\n", ic_strcmp("GeeksForGeeks", "gEEksFORGeEKs"));
    printf("ret: %d\n", ic_strcmp("GeeksForGeeks", "geeksForGeeks"));
    return 0;
}

Producción: 

ret: 1
ret: -1
ret: -1
ret: -1
ret: 0
ret: 0

Complejidad de tiempo: O(min(|s1|, |s2|))

Espacio Auxiliar: O(1)

Este artículo fue compilado por Narendra Kangralkar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *