I am currently reading The C Programming Language by Dennis Richie and Brian Kernighan, and I came to implement the function squeeze (s1, s2)
as an exercise. squeeze()
deletes each character in s1
that matches any character in the string s2
. While coding squeeze()
, I thought that I can extend its capability to act like trim()
method in Java, and then the my code was already done, and tested.
However, even though it is implemented in C, I believe that the code below can be improved and optimized. Please help me do so.
char *squeeze (char *str1, char *str2) {
int i, j;
int str1Len = strlen (str1);
int toBeSubtractLen = 0;
char chr1 = '\0';
char chr2 = '\0';
for (i = 0; i < str1Len; i++) {
chr1 = str1 [i];
for (j = 0; j < strlen (str2); j++) {
chr2 = str2 [j];
if (chr1 == chr2) {
toBeSubtractLen++;
}
}
}
char *finalStr;
finalStr = malloc ((str1Len - toBeSubtractLen) + 1);
if (finalStr == NULL) {
printf ("Unable to allocate memory.\n");
exit (EXIT_FAILURE);
}
int indx = 0;
for (i = 0; i < str1Len; i++) {
chr1 = str1 [i];
for (j = 0; j < strlen (str2); j++) {
chr2 = str2 [j];
if (chr1 == chr2) {
break;
}
}
if (chr1 != chr2) {
finalStr[indx] = chr1;
indx++;
}
}
return finalStr;
} /* end of squeeze() */
Samples:
- str1 = ",AaBbCcDdEeFfGgHhIiJjKkLlMmAaAaAaNnOoPpQqRrSsTtUuVvWwXxYyZz"
- str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- str3 = "abcdefghijklmnopqrstuvwxyz"
- name = "ChristopherM.Sawi"
- birthday = "August14,1988"
Outputs:
1. squeeze-ing str1 by str2 yields: "<space>,<tab>abcdefghijklmaaanopqrstuvwxyz" 2. squeeze-ing str1 by str3 yields: "<space>m<tab>ABCDEFGHIJKLMAAANOPQRSTUVWXYZ" 3. squeeze-ing str2 by str3 yields: "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 4. squeeze-ing name by str3 yields: "C<space>M.<space>S" 5. squeeze-ing birthday by str1 yields: "141988"