Estoy empezando con C++ y hay algo que no entiendo por qué esta pasando, aquí esta mi codigo:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int pedirNombre();
void contarVocales(char*,int);
void mostrarVocales();
int *p_a, *p_e, *p_i, *p_o, *p_u; // punteros de los contadores;
char *nombre;
int main(){
contarVocales(nombre,pedirNombre());
mostrarVocales();
getch();
return 0;
}
int pedirNombre(){
int longitud;
char usuario[30];
cout<<"Digite su nombre: ";
cin.getline(usuario,30,'\n');
longitud = strlen(usuario);
nombre = &usuario[0];
return longitud;
}
void contarVocales(char* nombre,int n){
int c_a, c_e, c_i, c_o, c_u; //contador vocales;
c_a = 0;
c_e = 0;
c_i = 0;
c_o = 0;
c_u = 0;
p_a = &c_a;
p_e = &c_e;
p_i = &c_i;
p_o = &c_o;
p_u = &c_u;
for(int i=0;i<n;i++){
switch(*(nombre+i)){
case 'a': c_a++; break;
case 'e': c_e++; break;
case 'i': c_i++; break;
case 'o': c_o++; break;
case 'u': c_u++; break;
}
}
}
void mostrarVocales(){
cout<<"num. de a: "<<*p_a<<endl;
cout<<"num. de e: "<<*p_e<<endl;
cout<<"num. de i: "<<*p_i<<endl;
cout<<"num. de o: "<<*p_o<<endl;
cout<<"num. de u: "<<*p_u<<endl;
}
SALIDA:
---------------------------------------------------------------------------------------
Digite su nombre: aaaaaeeeeiiioou
num. de a: 1
num. de e: 4
num. de i: 3
num. de o: 2
num. de u: 1
---------------------------------------------------------------------------------------------
Si pongo un cout dentro de la funcion contarVocales() *p_a me da el valor correcto pero una vez sale de esa funcion y se meustra en la funcion mostrarVocales() me da el valor 1 todo el rato. El resto de vocales funcionan correctamente menos en la vocal a que es como si se borrase el valor al acabar la funcion y se sustituye por 1.
PD: he declarado los punteros de forma global por que no se otra forma de pasarlos a otra función y no se si puede pasar mas de un valor por el return (todos los ejemplos que he visto solo pasan 1 dato por el return).
PD2: por que cuando se usa una variable global como *nombre se declara dentro de el prototipo de función si en teoría si lo pasas sin referenciar también sive puesto que es un puntero global, es decir, en ves de usar:
void contarVocales(char*,int);
usar:
void contarVocales();
y escribir directamente la variable como en:
int pedirNombre();
Tengo un cacao con eso, debo o no debo poner las variables globales dentro del parentesis?¿ por lo que se si lo hago sin ser un puntero y no utiliza & pasaría una copia del valor (para asi no modificar el valor de la variable y usarlo en otra funciones si hace falta) pero en los punteros no veo la diferencia la verdad.
Se que es mucho pero la verdad agradecería a algún iluminado que me resuelva estas dudas que me están volviendo loco
. No quiero seguir más adelante con el curso ya que prefiero tener todo bien claro antes de profundizar más. Gracias!!!