Pasar string por referencia o no

Iniciado por sora_ori, 11 Febrero 2015, 20:44 PM

0 Miembros y 1 Visitante están viendo este tema.

sora_ori

Hola!

Estoy haciendo un programa modular y tengo dudas sobre si tengo que pasar una cadena por referencia o no.

Yo llamo a la función desde un menú


case 1:
        system("cls");
printf("La frase introducida es %s", introducirFrase());
getch();
break;


Y la función es la siguiente:

int introducirFrase(){
char cadena[255]="";
printf("Frase: ");
gets(cadena);

return cadena;
}


Al compilar y probar no deja escribir nada, me salta el menú principal.

Agradezco la ayuda  :P

_Enko

#1
Hola, mh... no es referencia el problema tuyo en el codigo que tienes. Pero si, pasar por referencia es lo que buscar.

Código (cpp) [Seleccionar]
printf("La frase introducida es %s", introducirFrase());

Código (cpp) [Seleccionar]
int introducirFrase(){

introducirFrase no retorna un char*.

Código (cpp) [Seleccionar]
char cadena[255]="";
printf("Frase: ");
gets(cadena);

return cadena;

char cadena[255] es una variable local. Desaparece al terminar la funcion.
return debe devolver int en tu caso.

Algo asi te deberia de servir:
Código (cpp) [Seleccionar]

void LeerCadena(char* cadena_){
   gets(cadena_);
}
int main(int argc, char *argv[]) {
   char cadena[255];
   LeerCadena(cadena); // $cadena[0] == cadena
   printf("%s", cadena);


Saludos.

rir3760

Ademas de lo indicado por _Enko (retornar en base a la variable local "cadena" debe ser el error principal) deberías evitar el uso de llamadas a system, gets y el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Y si envías un texto a la salida estándar con:
printf("Frase: ");
La cadena debe terminar con el carácter de avance de linea (para ello lo mas sencillo es utilizar puts en lugar de printf) o bien vacías explícitamente el bufer de la salida estándar con fflush(stdout).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

sora_ori

Buenas compañeros,

Sigo teniendo problemas a la hora de leer Strings, si leo caracteres no tengo problema pero como quiera escribir un Strings con una frase con espacios me da el siguiente error:


No me permite escribir nada en el String

printf("Introduce el String: ");
gets(frase);

printf("\nLa frase sin la primera palabra: %s\n", quitarPrimera(frase));
system("pause");





char* quitarPrimera(char frase[20]);


int main(){

char frase[20];


Creo que será que tengo que recoger de otra forma la cadena porque con un SCANF puedo pero no me permite coger frases con espacios y no es el objetivo que estoy buscando.

Gracias!!!

rir3760

Cita de: sora_ori en 16 Febrero 2015, 19:54 PMCreo que será que tengo que recoger de otra forma la cadena porque con un SCANF puedo pero no me permite coger frases con espacios y no es el objetivo que estoy buscando.
Con la información que muestras no es posible ayudarte, por favor publica el código fuente completo.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

sora_ori

#5
Buenas,

Ya he podido solventar el problema de leer un String, ahora tengo problemas al pasar por referencia, dejo el código:

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

int frecuencia(char *, char letra);


int main(){
int opcion=1;
char frase[20], letra;

while(opcion!=5){
system("cls");
printf("1. Introducir frase\n");
printf("2. Frecuencia caracter\n");
printf("3. Quitar primera palabra\n");
printf("4. Sin espacios en blanco\n");
printf("5. Salir\n");
printf("\n\nEscoge una opcion: ");
fflush(stdin);
scanf("%i", &opcion);

switch (opcion){
case 1:
system("cls");
printf("Introduce una frase ");
fflush(stdin);
gets(frase); // Guardamos el String

printf("\n\nLa frase introducida es:\n\n\n");
printf("%s", frase);
fflush(stdin);

getch();
break;

case 2:
system("cls");
printf("\n\nQue letra quieres buscar en la cadena? ");
scanf("%c", &letra); // guardamos la letra que queremos buscar en la cadena
printf("La letra %c aparece %i veces repetidas", letra, frecuencia(frase,letra));
getch();
break;

case 3:
system("cls");
//printf("\nLa frase sin la primera palabra: %s\n", quitarPrimera(frase));
system("pause");
break;
case 4:
system("cls");
//printf("\nLa frase sin espacio es: %s\n", sinEspacios(frase));
break;
case 5:
system("cls");
printf("Hasta luego!");
getch();
return 0;
break;
default:
printf("\nOpcion incorrecta! Intenta de nuevo");

}
getch();

}

getch();
return 0;
}// fin main

// Función para comprobar cuantas veces se repite una letra
int frecuencia(char *frase[20], char letra){
int i, cont=0; // la variable contador será la encargada de sumar cuando se encuentre la letra

for (i=0; frase[i] != '\0'; i++){ // recorremos con un for hasta encontrar el espacio en blanco
if (frase[i] == letra){ // si el punto de la cadena es = a la letra que queremos encontrar
cont++;              // sumara el contador
}
}
return cont; // retornaremos las veces que se ha encontrado el caracter que hemos buscado en el for
}


Al leer un String y pasarlo por referencia se pone " & " delante de la variable pero me da error.

Gracias

theluigy13etv

Si te das cuenta, en el prototipo de tu función declaraste como char *. De la misma forma debes hacerlo en la implementación.

Cambia esto que está así:


int frecuencia(char *frase[20], char letra)


Por esto:


int frecuencia(char *frase, char letra)

sora_ori

#7
Ya lo he podido solucionar TODO!

Gracias por la ayuda compañeros!! :)

Saludos