Рубрики

Напишите свой собственный strcmp, который игнорирует случаи

Напишите модифицированную функцию strcmp, которая игнорирует регистры и возвращает -1, если s1 <s2, 0, если s1 = s2, иначе возвращает 1. Например, ваш strcmp должен рассматривать «GeeksforGeeks» и «geeksforgeeks» как одну и ту же строку.

Источник: Microsoft Интервью Сет 5

Следующее решение предполагает, что символы представлены с использованием представления ASCII, то есть коды для «a», «b», «c»,… «z» равны 97, 98, 99,… 122 соответственно. И коды для «A», «B», «C»,… «Z» — 65, 66,… 95 соответственно.

Ниже приведены подробные шаги.
1) Выполните итерацию по каждому символу обеих строк и выполните следующие действия для каждого символа.
… А ) Если str1 [i] совпадает с str2 [i], то продолжить.
Б) Если инвертирование 6-го младшего значащего бита в str1 [i] делает его таким же, как в str2 [i], то продолжайте. Например, если str1 [i] равен 65, то инвертирование 6-го бита сделает его 97. А если str1 [i] равно 97, то инвертирование 6-го бита сделает его 65.
… В ) Если какое-либо из вышеперечисленных условий неверно, нарушите.
2) Сравните последние (или первые несовпадения в случае не одинаковых) символов.

C ++

#include <bits/stdc++.h>

using namespace std;

/ * реализация strcmp, игнорирующая регистры * /

int ic_strcmp(string s1, string s2) 

    int i; 

    for (i = 0; s1[i] && s2[i]; ++i) 

    

        / * Если символы совпадают или инвертируют

        6-й бит делает их такими же * /

        if (s1[i] == s2[i] || (s1[i] ^ 32) == s2[i]) 

        continue

        else

        break

    

  

    / * Сравните последнее (или первое несоответствие в

    регистр не одинаковый) символов * /

    if (s1[i] == s2[i]) 

        return 0; 

  

    // Устанавливаем 6-й бит в обоих, затем сравниваем

    if ((s1[i] | 32) < (s2[i] | 32)) 

        return -1; 

    return 1; 

  
// Программа драйвера для проверки вышеуказанной функции

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; 

  
// Этот код предоставлен rathbhupendra

С

#include <stdio.h>

  
/ * реализация strcmp, игнорирующая регистры * /

int ic_strcmp(char *s1, char *s2)

{

    int i;

    for (i = 0; s1[i] && s2[i]; ++i)

    {

        / * Если символы совпадают или инвертируют

           6-й бит делает их такими же * /

        if (s1[i] == s2[i] || (s1[i] ^ 32) == s2[i])

           continue;

        else

           break;

    }

  

    / * Сравните последнее (или первое несоответствие в

       регистр не одинаковый) символов * /

    if (s1[i] == s2[i])

        return 0;

  

    // Устанавливаем 6-й бит в обоих, затем сравниваем

    if ((s1[i] | 32) < (s2[i] | 32)) 

        return -1;

    return 1;

}

  
// Программа драйвера для проверки вышеуказанной функции

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;

}

Выход:

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

Эта статья составлена Нарендрой Кангралкар . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Напишите свой собственный strcmp, который игнорирует случаи

0.00 (0%) 0 votes