Ayuda con codigo en C.

Buenas a todos, pues como dice el titulo tengo un problema con este codigo. Lo que quiero hacer es contar cuantos espacios hay en un texto, y por ello creo una funcion que se ocupa de eso y que luego devuelve el valor de este y que lo imprima la funcion main. Se perfectamente que se puede hacer sin funcion extra pero estoy practicando las funciones y como no me sale, pregunto donde puede estar el fallo sin en el codigo o en la teoria de funciones. Queda claro que soy novato en programacion :)

PD: Hay que usar CONTROL+Z despues de escribir el texto para que ande el programa.

#include <stdio.h>

int espacios(char c, int n_esp);

int main()
{
     int i; /*Variable que almacenara el numero de espacios que retorna la otra funcion*/
     char c;  /*El texto*/

     while((c=getchar())!=EOF);
     espacios(c,i);

     printf("Numero de espacios = %d",i);


}

int espacios(char c, int n_esp)
{

    int i;
    n_esp=0;
    if(c==' '||c=='\t'||c=='\n')
    ++n_esp;

    return n_esp;
}
Bueno, entre errores y consejos, ahí te dejo esto:
- En la función espacios, la variable "i" no la usas para nada.
- Nunca inicializas ni modificas la variable "i" del main (la pasas por valor).
- No haces nada con el resultado devuelto por la llamada a la función espacios.
- Podrías tener como único parámetro el texto (en este caso, el carácter), ya que devuelve un entero. Si quisieras modificar el valor de i dentro de la función, tendrías que usar punteros (imagino que no has llegado a ellos todavía) y la función podría no devolver nada (void).
- En el while sobra el ";", tal cual está la llamada a espacios es independiente del bucle y se ejecutará una única vez.
- No todas las variables enteras tienen por qué llamarse i, luego releerás un programa medio grande y morirás en el intento.
- En vez de usar control+Z puedes usar tuberías.
- Es aconsejable usar los corchetes en las estructuras de control aunque sólo haya una sentencia.
amuchamu escribió:Bueno, entre errores y consejos, ahí te dejo esto:
- En la función espacios, la variable "i" no la usas para nada.
- Nunca inicializas ni modificas la variable "i" del main (la pasas por valor).
- No haces nada con el resultado devuelto por la llamada a la función espacios.
- Podrías tener como único parámetro el texto (en este caso, el carácter), ya que devuelve un entero. Si quisieras modificar el valor de i dentro de la función, tendrías que usar punteros (imagino que no has llegado a ellos todavía) y la función podría no devolver nada (void).
- En el while sobra el ";", tal cual está la llamada a espacios es independiente del bucle y se ejecutará una única vez.
- No todas las variables enteras tienen por qué llamarse i, luego releerás un programa medio grande y morirás en el intento.
- En vez de usar control+Z puedes usar tuberías.
- Es aconsejable usar los corchetes en las estructuras de control aunque sólo haya una sentencia.


Gracias por contestar, vamos por pasos:
- La variable i de espacios se debe a pruebas para intentar que funcione(sin exito) y se me olvido borrar.
- El ";" se debe a lo mismo que la i de espacios.
- Usar i en todo es una mania(mala) que he cojio de "i" de indice para bucles.
- Lo de tuberias no se lo que es.
- Lo del corchete totalmente de acuerdo contigo.

Y como pregunta: ¿Necesito punteros para hacer esto, obligatoriamente? quiero decir devolver un entero es necesario usar punteros. A lo mejor lo que pregunto es obvio pero sino se pregunta no se aprende ¿no? :-|
BaGuZiD escribió:- Lo de tuberias no se lo que es.

Bueno, lo podrías buscar :P Una tubería (pipe, "|") sirve para redirigir la salida estándar de un programa a la entrada estándar de otro. Tu programa está leyendo los datos de la entrada estándar (stdin) y escribiendo en la salida estándar (stdout). Por ejemplo, en linux podrías hacer lo siguiente (si usas windows, creo que es similar):

echo "calamares a la romana" | ./espacios

Que equivaldría a iniciar tu programa, escribir "calamares a la romana" y cerrar la entrada estándar (tu control+z).
Otra opción sería meterle un fichero, por ejemplo el código del programa:

cat espacios.c | ./ espacios

Si estás siguiendo algún manual, ya llegarás.

BaGuZiD escribió:Y como pregunta: ¿Necesito punteros para hacer esto, obligatoriamente? quiero decir devolver un entero es necesario usar punteros. A lo mejor lo que pregunto es obvio pero sino se pregunta no se aprende ¿no?

No, para devolver un entero sólo tienes que hacer una función que devuelva el tipo de datos int y usar el return correctamente. Por ejemplo:

int foo(){
  return 3;
}

No hace falta nada más, ningún parámetro ni nada. Los punteros se usan, entre otras cosas, para poder modificar desde una función variables de fuera de la función (paso por referencia en vez de por valor).

Lo que pasa es que luego tienes que usar el valor devuelto por la llamada a la función, por ejemplo:

int resultado = 2 + foo();
3 respuestas