Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sora_ori en 11 Febrero 2015, 20:44 pm



Título: Pasar string por referencia o no
Publicado por: sora_ori en 11 Febrero 2015, 20:44 pm
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ú

Código
  1. case 1:
  2.        system("cls");
  3. printf("La frase introducida es %s", introducirFrase());
  4. getch();
  5. break;
  6.  

Y la función es la siguiente:

Código
  1. int introducirFrase(){
  2. char cadena[255]="";
  3. printf("Frase: ");
  4. gets(cadena);
  5.  
  6. return cadena;
  7. }

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

Agradezco la ayuda  :P


Título: Re: Pasar string por referencia o no
Publicado por: _Enko en 11 Febrero 2015, 21:29 pm
Hola, mh... no es referencia el problema tuyo en el codigo que tienes. Pero si, pasar por referencia es lo que buscar.

Código
  1. printf("La frase introducida es %s", introducirFrase());
  2.  
Código
  1. int introducirFrase(){

introducirFrase no retorna un char*.

Código
  1. char cadena[255]="";
  2. printf("Frase: ");
  3. gets(cadena);
  4.  
  5. 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
  1. void LeerCadena(char* cadena_){
  2.    gets(cadena_);
  3. }
  4. int main(int argc, char *argv[]) {
  5.    char cadena[255];
  6.    LeerCadena(cadena); // $cadena[0] == cadena
  7.    printf("%s", cadena);
  8.  

Saludos.


Título: Re: Pasar string por referencia o no
Publicado por: rir3760 en 12 Febrero 2015, 03:17 am
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| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Y si envías un texto a la salida estándar con:
Código
  1. 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


Título: Re: Pasar string por referencia o no
Publicado por: sora_ori en 16 Febrero 2015, 19:54 pm
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:

(http://i59.tinypic.com/28rmy2x.png)
No me permite escribir nada en el String

Código
  1. printf("Introduce el String: ");
  2. gets(frase);
  3.  
  4. printf("\nLa frase sin la primera palabra: %s\n", quitarPrimera(frase));
  5. system("pause");



Código
  1. char* quitarPrimera(char frase[20]);
  2.  
  3.  
  4. int main(){
  5.  
  6. 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!!!


Título: Re: Pasar string por referencia o no
Publicado por: rir3760 en 17 Febrero 2015, 03:25 am
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.
Con la información que muestras no es posible ayudarte, por favor publica el código fuente completo.

Un saludo


Título: Re: Pasar string por referencia o no
Publicado por: sora_ori en 17 Febrero 2015, 18:42 pm
Buenas,

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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int frecuencia(char *, char letra);
  6.  
  7.  
  8. int main(){
  9. int opcion=1;
  10. char frase[20], letra;
  11.  
  12. while(opcion!=5){
  13. system("cls");
  14. printf("1. Introducir frase\n");
  15. printf("2. Frecuencia caracter\n");
  16. printf("3. Quitar primera palabra\n");
  17. printf("4. Sin espacios en blanco\n");
  18. printf("5. Salir\n");
  19. printf("\n\nEscoge una opcion: ");
  20. fflush(stdin);
  21. scanf("%i", &opcion);
  22.  
  23. switch (opcion){
  24. case 1:
  25. system("cls");
  26. printf("Introduce una frase ");
  27. fflush(stdin);
  28. gets(frase); // Guardamos el String
  29.  
  30. printf("\n\nLa frase introducida es:\n\n\n");
  31. printf("%s", frase);
  32. fflush(stdin);
  33.  
  34. getch();
  35. break;
  36.  
  37. case 2:
  38. system("cls");
  39. printf("\n\nQue letra quieres buscar en la cadena? ");
  40. scanf("%c", &letra); // guardamos la letra que queremos buscar en la cadena
  41. printf("La letra %c aparece %i veces repetidas", letra, frecuencia(frase,letra));
  42. getch();
  43. break;
  44.  
  45. case 3:
  46. system("cls");
  47. //printf("\nLa frase sin la primera palabra: %s\n", quitarPrimera(frase));
  48. system("pause");
  49. break;
  50. case 4:
  51. system("cls");
  52. //printf("\nLa frase sin espacio es: %s\n", sinEspacios(frase));
  53. break;
  54. case 5:
  55. system("cls");
  56. printf("Hasta luego!");
  57. getch();
  58. return 0;
  59. break;
  60. default:
  61. printf("\nOpcion incorrecta! Intenta de nuevo");
  62.  
  63. }
  64. getch();
  65.  
  66. }
  67.  
  68. getch();
  69. return 0;
  70. }// fin main
  71.  
  72. // Función para comprobar cuantas veces se repite una letra
  73. int frecuencia(char *frase[20], char letra){
  74. int i, cont=0; // la variable contador será la encargada de sumar cuando se encuentre la letra
  75.  
  76. for (i=0; frase[i] != '\0'; i++){ // recorremos con un for hasta encontrar el espacio en blanco
  77. if (frase[i] == letra){ // si el punto de la cadena es = a la letra que queremos encontrar
  78. cont++;              // sumara el contador
  79. }
  80. }
  81. return cont; // retornaremos las veces que se ha encontrado el caracter que hemos buscado en el for
  82. }

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

Gracias


Título: Re: Pasar string por referencia o no
Publicado por: theluigy13etv en 19 Febrero 2015, 18:41 pm
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í:

Código:
int frecuencia(char *frase[20], char letra)

Por esto:

Código:
int frecuencia(char *frase, char letra)


Título: Re: Pasar string por referencia o no
Publicado por: sora_ori en 19 Febrero 2015, 21:22 pm
Ya lo he podido solucionar TODO!

Gracias por la ayuda compañeros!! :)

Saludos