Search code examples
cstringletters

Create a new string that will consist of common letters from other two strings


I'm new to C programming. I have a task to do. User inputs two strings. What I need to do is to create a new string that will consist only from common letters of those two given strings. For example: if given:

str1 = "ABCDZ"
str2 = "ADXYZ"

the new string will look like: "ADZ". I can't make it work. I think there must be a better (more simple) algorithm but I have waisted too much time for this one so I want to complete it .. need your help!

what I've done so far is this:

char* commonChars (char* str1, char* str2)
{
    char *ptr, *qtr, *arr, *tmp, *ch1, *ch2;
    int counter = 1;
    ch1 = str1;
    ch2 = str2;
    arr = (char*) malloc ((strlen(str1)+strlen(str2)+1)*(sizeof(char))); //creating dynamic array
    strcpy(arr, str1);
    strcat(arr,str2);
    for (ptr = arr; ptr < arr + strlen(arr); ptr++)
    {
        for (qtr = arr; qtr < arr + strlen(arr); qtr++) // count for each char how many times is appears
        {
            if (*qtr == *ptr && qtr != ptr)
            {
                counter++;
                tmp = qtr;
            }
        }
        if (counter > 1)
        {
            for (qtr = tmp; *qtr; qtr++) //removing duplicate characters
                *(qtr) = *(qtr+1);
        }
        counter = 1;
    }
    sortArray(arr, strlen(arr)); // sorting the string in alphabetical order
    qtr = arr;
    for (ptr = arr; ptr < arr + strlen(arr); ptr++, ch1++, ch2++) //checking if a letter appears in both strings and if at least one of them doesn't contain this letter -  remove it
    {
        for (qtr = ptr; *qtr; qtr++)
        {
            if (*qtr != *ch1 || *qtr != *ch2)
                *qtr = *(qtr+1);
        }
    }
}

Don't know how to finish this code .. i would be thankful for any suggestion!


Solution

  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define min(x,y) ((x)<(y)? (x) : (y))
    
    char* commonChars (const char *str1, const char *str2){
        //str1, str2 : sorted(asc) and unique
        char *ret, *p;
        int len1, len2;
        len1=strlen(str1);
        len2=strlen(str2);
        ret = p = malloc((min(len1, len2)+1)*sizeof(char));
    
        while(*str1 && *str2){
            if(*str1 < *str2){
                ++str1;
                continue;
            }
            if(*str1 > *str2){
                ++str2;
                continue;
            }
            *p++ = *str1++;
            ++str2;
        }
        *p ='\0';
    
        return ret;
    }
    
    char *deleteChars(const char *str, const char *dellist){
        //str, dellist : sorted(asc) and unique
        char *ret, *p;
        ret = p = malloc((strlen(str)+1)*sizeof(char));
    
        while(*str && *dellist){
            if(*str < *dellist){
                *p++=*str++;
                continue;
            }
            if(*str > *dellist){
                ++dellist;
                continue;
            }
            ++str;
            ++dellist;
        }
        if(!*dellist)
            while(*str)
                *p++=*str++;
        *p ='\0';
    
        return ret;
    }
    
    int main(void){
        const char *str1 = "ABCDXYZ";
        const char *str2 = "ABCDZ";
        const char *str3 = "ADXYZ";
        char *common2and3;
        char *withoutcommon;
    
        common2and3 = commonChars(str2, str3);
        //printf("%s\n", common2and3);//ADZ
        withoutcommon = deleteChars(str1, common2and3);
        printf("%s\n", withoutcommon);//BCXY
    
        free(common2and3);
        free(withoutcommon);
        return 0;
    }