Problema funciones c++

ExTiNcT_

No sé por que esta funcion q pegaré a continuacion no da el resultado q deberia, y la verdad q no sé q es ni q puede estar mal, la repasé mil veces. Lo q hace es si te dan una palabra por ejemplo "hola,-" te quita los caracteres q no sean letras y te lo deja como "hola" y si elimina dos puntos o más además debe devolver el fi como true.

bool nomesLletres(char paraula[])
{
int longitud, posicioLletra, final;
bool fi = false;

posicioLletra=0;
final=0;
 
longitud = strlen(paraula);

while(posicioLletra < longitud)
{
     if(paraula[posicioLletra] >= 'a' && paraula[posicioLletra] <= 'z') posicioLletra++;
     
     else
     {
          if(paraula[posicioLletra] == '.')
          {
          final++;
          if (final >= '2') fi = true;
          }
          
          paraula[posicioLletra] = '\0';
          longitud--;
     }
     posicioLletra++;
     
}
printf("El final ves: %i\n",final);
return fi;

}

PD: el problema es q contador de "final" cuenta como quiere, por ejemplo pones "hola.." y el final vale 1 en lugar de 2. Y si pongo por ejemplo "hola....." al final le dá por contar 3 (q obviamente hay más), y encima no me devuelve como true del "fi", siendo final > 2.

MTX_Anubis

final es un integer así que quitale las comillas al '2'

Cuando encuentras una letra le sumas dos a posicioLletra, no sé si quieres hacerlo así o no pero si metes palabras con letras impares se va a saltar lo siguiente que haya a la última letra de la palabra.

Con \0 no haces desaparecer esa posición de la array, con eso indicas que es el final de la array (ves haciendo printf, ya verás que gracioso es en cuanto encuentra el primer punto xD, o mejor aún, usa el debugger) tendrías que mover todo lo que hay detrás y sobreescribirlo.

por otro lado, no te cuenta todos los puntos porque estás bajando la longitud cada vez que encuentras uno así que si tienes un punto en la posición 7 y longitud lo bajas hasta 6, a partir de ahí no te va a contar. Además si no me equivoco, estás mirando fuera de rango de la array por aquello de que le has metido un /0 en cuanto has encontrado un punto, lo que pasa es que es que no se modifican y te hace las comparaciones.

Vamos eso último creo que es así pero no podría asegurarlo al 100% xD

ExTiNcT_

#2 gracias, ahora los contadores van bien. El fallo ese de longitud la verdad es q es bastante tonto.. pero llevo toda la tarde liado con faena y llega un punto q cualquier fallo tonto se te hace una montaña xD

Pero continuo con el problema del "fi", el contador final vale más de 2 (en el caso de "hola.." por ejemplo), con lo cual deberia devolver el parámetro fi con el valor de "true", en cambio en el main no le consta como tal, y no sale del bucle while(!fi).. verás te lo pego aqui q es mucho más entendible, gracias.

http://pastebin.com/d19506784

MTX_Anubis

Supongo que final te lo escribirá bien y además te escribirá el "entras" pero no sale del while, eso es porque el fi que estás modificando es el de la función, no el del mail. Pasalo por argumento a la función nomesLletres y ya está

además en vez de hacer esto dentro del while (posicioLletra < longitud):

    if(paraula[posicioLletra] >= 'a' && paraula[posicioLletra] <= 'z') posicioLletra++;
     
     else
     {
          if(paraula[posicioLletra] == '.') final++;
          paraula[posicioLletra] = '\0';
          posicioLletra++;
     }

es más fácil esto

http://pastebin.com/m6a0a4870

JuAn4k4

Hay funciones que te dicen si un caracter es : Digito, Letra, Alfanumerico, etc... no me acuerdo muy bien como eran pero algo asi: isdigit(c); isalphanumeric(c) isoalnum(c) , son parecidas , no recuerdo muy bien pero estan en stdio creo o en stdlib.

Y con eso seria un bucle de ir copiando una cadena en otra si se cumple la condicion de una de esas funciones encada caracter. Es decir, te complicas demasiado.

skarXa

Como los caracteres que no sean letras estén a mitad de cadena, vas a acabar truncando el resultado..
deberías montarte la cadena aparte y luego devolverla como resultado.
En cuanto a lo del fi, pues miralo con el debug, hace bastantes años que no toco el C++ pero mira a ver si es por la forma en que se validan los bool, prueba usando los literales true y false para asignar valores a las variables bool que uses, o ya puestos prueba con un int a ver..

JuAn4k4

Mira a ver si esto te sirve, hace lo mismo creo.

void quitaExtranos(char* frase){
  int i;
  int j;
  char copia[200];

  j=0;
  for(i=0;i<=strlen(frase);i++)
    {
    if ( isalpha((int)frase[i]) )
      {
      copia[j]=frase[i];
      j++;
      }
    }
    copia[j+1]='\0';
   strcpy(frase,copia);
}

Usuarios habituales

  • JuAn4k4
  • skarXa
  • MTX_Anubis
  • ExTiNcT_