elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar string por referencia o no
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pasar string por referencia o no  (Leído 4,893 veces)
sora_ori

Desconectado Desconectado

Mensajes: 269



Ver Perfil
Pasar string por referencia o no
« 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


En línea

_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: Pasar string por referencia o no
« Respuesta #1 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.


« Última modificación: 11 Febrero 2015, 21:42 pm por _Enko » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Pasar string por referencia o no
« Respuesta #2 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|.

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
En línea

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

Desconectado Desconectado

Mensajes: 269



Ver Perfil
Re: Pasar string por referencia o no
« Respuesta #3 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:


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!!!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Pasar string por referencia o no
« Respuesta #4 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
En línea

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

Desconectado Desconectado

Mensajes: 269



Ver Perfil
Re: Pasar string por referencia o no
« Respuesta #5 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
« Última modificación: 18 Febrero 2015, 18:38 pm por sora_ori » En línea

theluigy13etv

Desconectado Desconectado

Mensajes: 179


Primero se hace, después se mejora


Ver Perfil
Re: Pasar string por referencia o no
« Respuesta #6 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)
En línea

sora_ori

Desconectado Desconectado

Mensajes: 269



Ver Perfil
Re: Pasar string por referencia o no
« Respuesta #7 en: 19 Febrero 2015, 21:22 pm »

Ya lo he podido solucionar TODO!

Gracias por la ayuda compañeros!! :)

Saludos
« Última modificación: 19 Febrero 2015, 21:52 pm por sora_ori » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
warning al pasar por referencia una variable local.
Programación C/C++
botella 6 4,410 Último mensaje 8 Julio 2010, 07:41 am
por carlitos_jajajajaja
¿Cómo puedo pasar dos enteros por referencia?
Java
theluigy13etv 2 2,694 Último mensaje 16 Abril 2012, 20:04 pm
por theluigy13etv
Pasar matriz char a una función como referencia
Programación C/C++
KISKE 2 7,298 Último mensaje 18 Junio 2013, 13:07 pm
por KISKE
pasar por referencia un puntero
Programación C/C++
m@o_614 2 7,107 Último mensaje 18 Enero 2014, 18:13 pm
por rir3760
[Duda] Pasar struct por referencia
Programación C/C++
jaxoR 9 5,597 Último mensaje 27 Agosto 2014, 02:50 am
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines