Skip to content
Related Articles

Related Articles

Improve Article

Write your own strcmp that ignores cases

  • Difficulty Level : Medium
  • Last Updated : 24 Jun, 2021
Geek Week

Write a modified strcmp function which ignores cases and returns -1 if s1 < s2, 0 if s1 = s2, else returns 1. For example, your strcmp should consider “GeeksforGeeks” and “geeksforgeeks” as same string.
Source: Microsoft Interview Set 5
Following solution assumes that characters are represented using ASCII representation, i.e., codes for ‘a’, ‘b’, ‘c’, … ‘z’ are 97, 98, 99, … 122 respectively. And codes for ‘A’, “B”, ‘C’, … ‘Z’ are 65, 66, … 90 respectively. 
Following are the detailed steps. 
1) Iterate through every character of both strings and do following for each character. 
a) If str1[i] is same as str2[i], then continue. 
b) If inverting the 6th least significant bit of str1[i] makes it same as str2[i], then continue. For example, if str1[i] is 65, then inverting the 6th bit will make it 97. And if str1[i] is 97, then inverting the 6th bit will make it 65. 
c) If any of the above two conditions is not true, then break. 
2) Compare the last (or first mismatching in case of not same) characters. 
 

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;
}

Output: 

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

This article is compiled by Narendra Kangralkar. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :