I\'m learning how to write programs in C using the k&r book (The C Programming Language) and I have a problem with one of the exercises. It\'s asking me to detect and re
void squeeze(char s1[], char s2[])
{
int i,j,k;
char c;
for(i=0;s2[i]!='\0';i++)
{
c=s2[i];
for(j=k=0;s1[j]!='\0';j++)
if(s1[j]!=c)
s1[k++]=s1[j];
s1[k]='\0';
}
}
A binary search is way overkill for this. You need three indices. One index (i) to walk through s, one index (k) to walk through t, and one index (j) to keep track of where you are in s for the characters that you need to keep because they are not in t. So, for each character in s, check and see if it is in t. If it is not, keep it in s.
void squeeze(char *s, char *t) {
int i, j, k;
int found = 0;
for(i = j = 0; s[i] != '\0'; i++) {
found = 0;
for(k = 0; t[k] != '\0' && (found == 0); k++) {
if(t[k] == s[i]) {
found = 1;
}
}
if(found == 0) {
s[j++] = s[i];
}
}
s[j] = '\0';
}
Great book. If I were you, I would proceed exactly as for the squeeze() in section 2.8, but instead of a direct comparison (s[i] != c) I would write and exploit a function
int contains(char s[], int c)
which returns 1 if the string s contains c, 0 otherwise. Start with the simple approach; when it works you may improve performance with more complex solutions (binary search, but note that the problem doesn't require the characters in s2 to be in a particular order).
You don't need a fancy binary search to do the job. What you need is a double for loop that check for occurrence of each char in one string in another, and copy the non-occurring chars into a third char array (which is your result).
Code can be something like the following (not tested!):
char *s1, *s2, *result; /* original strings and the result string */
int len1, len2; /* lengths of the strings */
for (i = 0; i < len1; i++) {
for (j = 0; j < len2; j++) {
if (s1[i] == s2[j]) {
break;
}
}
if (j == len2) { /* s1[i] is not found in s2 */
*result = s1[i];
result++; /* assuming your result array is long enough */
}
}
this is my function:
void squeeze(char s1[],char s2[])
{
int i,j,p;
int found;
p=0;
for(i=0;s1[i]!='\0';i++)
{
for(j=0;s2[j]!='\0';j++)
if(s1[i]==s2[j])
found=YES;
else
found=NO;
if(found==NO)
s1[p++]=s1[i];
}
s1[p]='\0';
}