Este es el código que está en el libro y cuando lo copilo no funciona, supuestamente borra todas las z de la cadena cual es el error?
#include <stdio.h>
main ()
{
int i,c,a;
char s[50];
char b;
b="z";
for (i=0;i<50 && (c=getchar())!='\n';++i)
s[i]=c;
for (i=0;s[i]!='\0';++i)
if (s[i]!=b)
s[b++]=s[i];
printf ("%c",s[b]);
}
tiene algunos detalles pequeños por ejemplo el b="z" deberia ser b='z', y tu funcion main no esta retornando nada y tampoco le pasas parametros(muchos compiladores decentes alegan con ese tipo de cosas). seria
adios
también el libro se ha quedado a gusto metiendo código que no funciona xDDDDD
for (i=0;i<50 && (c=getchar())!='\n';++i)
s[i]=c;
fíjate en el bucle.
hace una comparación para salir, si i >= 50 sale o si getchar() devuelve caracter de linea nueva.
hasta aquí todo correcto, pero si devuelve caracter de linea nueva no lo introduce en el buffer 's' por que se ha salido del bucle.
Tampoco pasa nada por que en la siguiente linea no utilizas el '\n' sino que utilizas '\0', cosa que está perfecto si hubieras hecho al principio un memset a 0 de todo el buffer.
MAS FALLOS:
La codificación ascii de la 'z' es 122 en decimal, vamos a pensar en el código del libro:
for (i=0;s[i]!='\0';++i)
if (s[i]!=b)
s[b++]=s[i];
es decir
para todas las letras que hay en el buffer.
----> si alguna de las letras vale lo mismo que b es decir, 'z'
---------> s[122] = letra actual
y lo mismo para las siguientes, dado que aumentas el char b con b++.
Ahora vamos a estudiar tu último printf, ponte que tenemos el siguiente buffer:
s = "holz que tzl"
s[0] = 'h'
s[1] = 'o'
s[2] = 'l'
s[3] = 'z'
s[4] = ' '
s[5] = 'q'
s[6] = 'u'
s[7] = 'e'
s[8] = ' '
s[9] = 't'
s[10] = 'z'
s[11] = 'l'
s[12] = '\0'
s[122] = unknown
s[123] = unknown
s[124] = unknown
-----
Después de la primera vez que entra por el IF los valores del buffer s entre 0 y 12 se mantienen igual, pero tu accederas a s que es lo mismo que s['z'] que es lo mismo que s[122], y tu has declarado un buffer de 50 elementos, además después de entrar por primera vez en el IF incrementas b, con lo cuál b deja de valer 'z' que es 122 y pasa a valer 123 ue en ascii es '{'.
con lo cuál cuando acaba el bucle tendremos lo siguiente:
* has entrado sólo una vez por el IF por que sólo busca una vez 'z' dentro del buffer, la próxima buscara '{' que no existirá seguramente en tu buffer.
* cuando encuentras en el buffer el valor de b no lo modificas en el buffer en la posición que querías, sino que lo haces más adelante, con el problema de acceder a una posición de memoria que no tienes reservada y que posiblemente te cause un segmentation fault.
De hecho en el if pone != b, por lo tanto entra si y sólo si la letra NO es la z, cagada por aqui. Luego el intercambio tampoco es correcto.
Saludos
Cita de: "StraT"De hecho en el if pone != b, por lo tanto entra si y sólo si la letra NO es la z, cagada por aqui. Luego el intercambio tampoco es correcto.
Saludos
juas cierto xDDDD
G+10 te voy a dar uno de los consejos más útiles que podrás recibir.
Debuggalo !
Si estás utilizando el Visual Studio, pulsa F5 y pon un breakpoint al principio y observa que va ocurriendo.
Si estás utilizando Linux utiliza el GDB.
Tu código tiene taaaaantos errores que lo mejor que puedes hacer es debuggar y comprobar los fallos donde están, nosotros aquí te podemos dar la solución pero no aprenderás nada de esa manera.
Otro buen consejo seria cambiar de libro :D