Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Código

Iniciado por G+10, 09 de Agosto de 2008, 05:20:31 AM

« anterior - próximo »

G+10

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]);

}
ual es el colmo de un puntero?? que sea de argentina jaja

vicho

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

Buffon

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.

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
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

Buffon

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.

bnl

Otro buen consejo seria cambiar de libro  :D
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.