Función de compresión de ejercicios de K&R

Entonces, el ejercicio aquí es diseñar un progtwig que tome una cadena y elimine todos los caracteres de esa cadena que aparecen en la segunda cadena. Así que con las cadenas que he elegido a continuación, donde la primera cadena es abc y la segunda cadena es cde, quiero obtener una salida de ab lugar de abc .

Ya he visto una forma muy ordenada de hacer esta función de compresión que solo requiere dos bucles simples, pero me preguntaba por qué mi forma tan larga no funciona.

 #include void squeeze(char s1[], char s2[]); void copy(char to[], char from[]); int k=0; main() { char array1[4]="abc"; char array2[4]="cde"; squeeze(array1, array2); printf("%s", array1); } void squeeze(char s1[], char s2[]) { int j,i,m; m=j=i=0; char s3[1000]; while(s1[i]!='\0') //What I'm doing here is taking a character in the string { //and comparing it with all characters in the second string. copy(s3,s1); //If it exists in the second string I'm 'deleting' that letter while(s2[j]!='\0') //from the first string. Then I start all over again with the { // next letter in line. Or at least that's the plan. if (s1[i]==s2[j]) { k=1; } ++j; } if (k==1) { m=i; while(s3[m+1]!='\0') { s1[m]=s3[m+1]; //I'm 'deleting' the letter by pushing each character ++m; //that is to the right of the deleted character to the } //left of the array. } if(k!=1) { ++i; } } s1[i]='\0'; } void copy(char to[], char from[]) { int i; i=0; while(from[i]!='\0') { to[i]= from[i]; ++i; } to[i]=='\0'; } 

dentro de su exterior mientras debería restablecer “j” a cero.

si “k” se convierte en 1, no incrementas más “i”. si ejecuta squeeze () una segunda vez, no inicializa “k” de nuevo.

nunca utilice variables globales (o variables locales del módulo) como “k”. Esto hace que su código sea inseguro.

High Five – También estoy leyendo ese capítulo. Creo que lo he leído unas 4 veces, de todos modos, realmente necesito aprender haciendo, olvido todo el contenido en unas pocas horas. Es por eso que casi he terminado todos los ejercicios en ese capítulo – ¡el capítulo 3 a continuación!

Aquí está mi solución: la función de compresión no es compatible con la función de línea de obtención (los /0' están forzando a que printf no imprima hasta la salida estándar.

Comstackr en gcc 4.7.2 con

gcc -Wall -std=c99 -pedantic squeeze.c

 #include  #define LIM 100 void squeeze(char[], char[]); int ggetline(char[], int); int main() { //the getline function is buggy; it would produce null strings. char line1[LIM] = "hello"; char line2[LIM] = "hello2"; squeeze(line1, line2); printf("%s %s\n", line1, line2); return 0; } /* getline: reads line into s, returns length */ int ggetline(char s[], int lim) { int c, i; for (i = 0; i < lim-1 && (c = getchar()) != EOF && c!='\n'; ++i) s[i] = c; if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } void squeeze(char s1[], char s2[]) { int j, l, i, k; for (i = 0; s2[i] != '\0'; i++) { for (k = l = 0; s2[j] != '\0'; j++) { if (s1[j] != s2[i]) s1[k++] = s1[j]; } s2[k] = '\0'; } } 

¡Buena suerte!