Ayuda con C y cadena de caracteres.

Buenas esque no se por donde cojer estos ejercicios.
·1.- Escribir un programa que cuente el número de palabras de más de cuatro caracteres una frase. Ésta se almacena en forma de cadena.

Como hago que sepa cuando empieza una palabra? y como hacer que sepa el numero de caracteres...

Tengo examen de esto el dia 2 o asi xD
/*1.- Escribir un programa que cuente el número de palabras de más de
cuatro caracteres una frase. Ésta se almacena en forma de cadena.*/
#include<stdlib.h>
#include<stdio.h>
#include<string.h>


int main()
{
    char frase[40];
    int i=0;
    printf("Introduce una frase: \n");
    _flushall();
    gets(frase);
   

    system("pause");
    return 0;
}
¿Con o sin funciones de string.h?

La frase empieza ya con una palabra, y a cada palabra le seguirá un espacio, signo de puntuación o final de línea. Empiezas a contar los caracteres de la primera palabra hasta que encuentres el caracter que indica que ya ha terminado, y sigues con la siguiente palabra, hasta el final de la línea.

Si quieres usar funciones de string.h, tienes strtok y strlen.
Gracias voi a ver que tal sino ahora comento

PD: con el strlen como guardo la cantidad de palabras con mas de 4 caracteres?
strlen sólo sirve para contar la longitud de las cadenas, usándola junto a strtok debería serte útil.
no hace falta que uses strlen para ver si tiene mas de 4 caracteres

tu empieza desde el principio recorriendo el string con un for de i=0 hasta strlen (frase), cuando llegues a un espacio compara el indice inicio (por llamarlo de alguna forma que sería 0 en un principio) con el i del del for. si la resta de i-inicio es mayor o igual q cuatro aumenta un contador en uno y ya esta.
Luego cambia el valor de inicio a i+1.

perdona si me he explicado mal , pero es complicao xD
Con strtok y strlen es más sencillo :P Pero si no lo has dado, pues a la otra forma.

Por cierto, usar gets es una mala idea, es inseguro, (aunque para este programa da bastante igual), hasta lo avisan algunos compiladores (gcc en este caso):

test.c:(.text+0x3d): warning: the `gets' function is dangerous and should not be used.
amuchamu escribió:Con strtok y strlen es más sencillo :P Pero si no lo has dado, pues a la otra forma.

Por cierto, usar gets es una mala idea, es inseguro, (aunque para este programa da bastante igual), hasta lo avisan algunos compiladores (gcc en este caso):

test.c:(.text+0x3d): warning: the `gets' function is dangerous and should not be used.


Hombre spongo que si no sabe hacer esto el usar strtok se le hará un mundo xD

por cierto usa scanf mejor que gets
gracias por la ayuda muchachos, una pregunta, como detecto (o como detecta el programa mejor dicho) que hay un espacio? gracias :P
amuchamu escribió:
if ( c == ' ') ...

gracias no sabia que se podia poner asin el espacio "by the face"
#include <stdio.h>
#include <string.h>

#define MAX 200

main()
{
   char frase[MAX];
   int i=0,j=0,cont=0;
   
   printf("Frase: ");
   gets(frase);
   
   while(frase[i]) //Este bucle se repite hasta llegar al '\0' que indica el final de la frase.
   {      
      while(frase[i]!=' ' && frase[i]!='.' && frase[i]!=',' && frase[i]!=';' && frase[i]!='\n' && frase[i])
      {
         //Si no es un caracter de separacion aumento i para señalar al siguiente caracter y aumento j para llevar la cuenta.
         i++;
         j++;
      }
      /*Al salir de ese while frase[i] es un caracter de separacion y como no hemos hecho i++ para avanzar de
      caracter, lo hacemos manualmente.*/
      i++;
      if(j>4) //Si hemos contado mas de 4 letras aumentamos en 1 el contador de palabras de mas de 4 letras.
         cont++;
      j=0; //Reset de j para contar desde el principio las letras de una nueva palabra.
      
   }
   printf("\nHay %d palabras de mas de 4 letras.\n",cont);
}


Pruebalo y me cuentas si te sirve. Si tienes mas dudas sobre C# comentalas y si puedo te ayudo.

Saludos!!

Adjuntos

de arte tio de arte, lo he comprendido perfectamente, muchas gracias en serio, voi a seguir haciendo ejercicios y si tengo duda con otro os comento

PD: funciona perfec, solo te faltaba el
system("pause");
return 0;
}

pero vamos que de lujo!!
Bueno, ya que te lo han hecho... :-? Pues pongo una solución con funciones de string.h.

#include <stdio.h>
#include <string.h>

int main(){
  char frase[128];
  char delim[] = " \n\t.,;:";
  char *token;
  unsigned count = 0;
 
  printf("Introduce una frase: ");
  gets(frase);  /* mala idea, pero bueno */
 
  token = strtok(frase, delim);
  if ( strlen(token) >= 4) count++;
  while ( (token = strtok(NULL, delim)) != NULL){
    if ( strlen(token) >= 4) count++;
  }
 
  printf("Resultado: %d\n", count);
 
  return 0;
}
joder!! de ese no me entero de na xD vaya noob q soy, gracias y perdonar las molestias que os este causando con estos ejercicios "tontos" para vosotros
joder, lo que no entiendo es porque se lo habeis hecho, asi no se aprende..
DjTemplar escribió:joder, lo que no entiendo es porque se lo habeis hecho, asi no se aprende..

jajajaja ... que malvado eres [sati] [sati]

Por cierto Iverson88 tu tranquilo que seguro que no sera tan dificil el examen... si sabes hacer los ejercicios que te ponen en clase sabras hacerlo...
A nosotros no toca hacerlos en (como digo yo) "PAPER-C" xDD... no veas lo que jode cuando tienes hecho un programa hecho y en el ultimo punto del ejercicio te ponga " pregunta al usuario si quiere salir y vuelve al principio si el usuario te dice no"... y tu [+risas] [+risas] [+risas] (ahora me lo dices ¬¬u).

Ahh y si te pasa eso... por favor... por el amor de dios, de shiva, de tu madre, de tu profesora o profesor, del vecino o de quien quieras... NO USES UN GOTO [qmparto] [qmparto] [qmparto]

Por cierto... Vosotros que habrias hecho en ese caso?? xD (GOTO PROHIBIDO)
A mi me daba patero (aunque seria lo correcto) reescribir todo el ejercicio metiendolo en otra funcion "pepito" (por ejemplo) y en el main hace run bucle con llamada pepito...
Esque era reescribir toda la hoja @_@ asi que no tendre el ejercicio del todo bien por culpa de no querer reescribirlo todo xD...
Pero me quede tan pancho colandole una comparacion al final del programa a base de if/else y si decia que no (volver a empezar) un (No me mateis por favor xD) return main();
Aunque tambien podria haberle plantao un main(); (llamada a la funcion main desde la funcion main xD)... funcionar funcionan ambas pero de ahi a que sea muy correcto el uso [+risas] [+risas] [+risas]
Almenos no use un GOTO como estaba haciendo el de al lao xD
En mi vida he visto un return main(); pero es totalmente correcto, no veo por qué debería ponerte menos nota.

Lo que toca es un:
do{
<menú>
<pedir opción>
<ejecutar acción>
}while <condición que es cierta por defecto y sólo se modifica en la opción de salir/preguntar si salir>

Pero si es en papel y ya lo tienes hecho, creo que tu opción es la mejor para no meter flechitas con código a la derecha ni nada de eso que todos hemos tenido que hacer en los exámenes ^^
16 respuestas