Comment compléter l’exercice K & R 2-4?

J’apprends à écrire des programmes en C en utilisant le livre k & r (Le langage de programmation C) et j’ai un problème avec l’un des exercices. Il me demande de détecter et de supprimer un caractère de la chaîne s1, qui correspond à tous les caractères de la chaîne s2.

Donc, disons s1 = “A”;

Et s2 = “AABAACAADAAE”

Je veux qu’il retourne “BCDE”

Je sais que je suis sur la bonne voie, je ne sais tout simplement pas comment concevoir des programmes, pourriez-vous me donner des conseils supplémentaires. J’ai essayé de lire sur l’algorithme d’arborescence de recherche binary, mais je pensais qu’il était un peu trop avancé pour cette tâche banale.

Merci tout le monde!

/* An alternate version of squeeze(s1, s2) that deletes each character in * s1 that matches any character in the ssortingng s2 * * Angie@odfx.org */ #include  #include  void squeeze(char s[], char t[]); char ssortingng[] = "BAD"; char sssortingng[] = "ABC"; int main(void) { squeeze(ssortingng, sssortingng); return 0; } void squeeze(char s[], char t[]) { int i, j, d; d = 0; if(strstr(s, t) == NULL) printf("%c", s[i]); s[j] = '\0'; } 

Grand livre. Si j’étais vous, je procéderais exactement comme pour squeeze () dans la section 2.8, mais au lieu d’une comparaison directe (s [i]! = C), j’écrirais et exploiterais une fonction

  int contains(char s[], int c) 

qui retourne 1 si la chaîne s contient c, 0 sinon. Commencez avec l’approche simple; lorsque cela fonctionne, vous pouvez améliorer les performances avec des solutions plus complexes (recherche binary, mais notez que le problème ne nécessite pas que les caractères de s2 soient dans un ordre particulier).

Une recherche binary est exagérée pour cela. Vous avez besoin de trois indices. Un index ( i ) pour parcourir s , un index ( k ) pour parcourir t et un index ( j ) pour savoir où vous vous trouvez dans s pour les personnages que vous devez conserver car ils ne sont pas en t . Donc, pour chaque caractère en s , vérifiez et voyez s’il est en t . Si ce n’est pas le cas, conservez-le à l’ 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'; } 

Vous n’avez pas besoin d’une recherche binary sophistiquée pour faire le travail. Ce dont vous avez besoin est une double boucle for qui vérifie la présence de chaque caractère dans une chaîne dans une autre et copie les caractères qui ne se produisent pas dans un troisième tableau de caractères (qui est votre résultat).

Le code peut être quelque chose comme ce qui suit (non testé!):

 char *s1, *s2, *result; /* original ssortingngs and the result ssortingng */ int len1, len2; /* lengths of the ssortingngs */ 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 */ } } 
 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'; } } 

c’est ma fonction:

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