Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Ixcal en 27 Septiembre 2012, 23:22 pm



Título: Duda de cadena de caracteres en C
Publicado por: Ixcal en 27 Septiembre 2012, 23:22 pm
Hola tengo una duda.

Soy nuevo en esto de la programación y ayer estaba en clases con un maestro de programación básica, nos  dejó un ejercicio en el cual teníamos que ingresar nuestro nombre y apellidos para que apareciera un saludo personalizado. Lo que hice fue crear un array de 80 elementos para guardar el nombre que se ingresara y hasta ahí todo bien.

El problema es que mi maestro dice que no es necesario generar un array de n elementos para guardar una cadena de caracteres y que eso se hacía cuando la memoria era poca y tenías que optimizar los recursos, pues bien, le quite el array y solo puse la variable nom tipo char, como pensé solo me guardó la primera letra. Después me puse a investigar en internet y encontré que solo puedo guardar una cadena de caracteres en un array tipo char. Así que mi duda es: ¿Se puede guardar una cadena de caracteres de otra forma en C? o si existe algún tipo de variable que sea tipo string o algo así.

Uso DevC++ y no estoy avanzado en lo de programar, solo hemos hecho cosas básicas como leer un caracter o sacar el área de un circulo.



Título: Re: Duda de cadena de caracteres en C
Publicado por: avesudra en 27 Septiembre 2012, 23:36 pm
Desde siempre las cadenas de carácteres en C se guardan en un array de carácteres que puede ser estático( cuando pones los elementos que va a tener) o dinámico .Es lógico que si solo pones un puntero a un carácter te salga solo la primera letra , pues solo hay espacio reservado para un carácter.No sé que es a lo que se refiere tu profesor , en C++ existe la clase string , pero al fin y al cabo termina siendo un array de char's.


Título: Re: Duda de cadena de caracteres en C
Publicado por: leosansan en 28 Septiembre 2012, 00:01 am
Hola tengo una duda.
Lo que hice fue crear un array de 80 elementos para guardar el nombre que se ingresara y hasta ahí todo bien.
Citar
Hasta ahí todo bien.
Citar
Así que mi duda es: ¿Se puede guardar una cadena de caracteres de otra forma en C? o si existe algún tipo de variable que sea tipo string o algo así.
Que yo sepa en C no, a no ser con el uso de punteros y la asignación dinámica de memoria Otra cosa es en C++ con la clase string, pero es muy avanzado para el nivel en que están.
Le entendiste mal o, lo más probable, se expresara mal.
Saludos!.


Título: Re: Duda de cadena de caracteres en C
Publicado por: Caster en 28 Septiembre 2012, 00:34 am
Pues la unica forma que hay es almacenarlo en un array, creo que hay otra pero si estais a ese nivel es muy compleja. Asi que o has entendido mal, o te han explicado mal.

Saludos


Título: Re: Duda de cadena de caracteres en C
Publicado por: yoxter en 28 Septiembre 2012, 00:54 am
Saludos creo que esto lo que buscas

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5. char *nombre;
  6. char *saludo = "buenos dias";
  7.  
  8. printf("por favor ingrese su nombre \n");
  9. scanf("%s", nombre);
  10.  
  11.  
  12. printf("%s %s",saludo,nombre);
  13.  
  14.  
  15.  
  16. return 0;
  17. }
  18.  


Título: Re: Duda de cadena de caracteres en C
Publicado por: rir3760 en 28 Septiembre 2012, 02:05 am
Saludos creo que esto lo que buscas

Código
  1. char *nombre;
  2.  
  3. /* ... */
  4.  
  5. scanf("%s", nombre);
No es valido. Toda variable local inicia con un valor no definido o "basura", antes de utilizar ese puntero se debe almacenar en el una dirección valida ya sea mediante el operador "&" (no necesario en el caso de arrays) o el valor de retorno de malloc/calloc/realloc.

Como ya se ha comentado en el tema C no tiene un tipo para cadenas, en su lugar estas se almacenan en array de caracteres.

Un saludo


Título: Re: Duda de cadena de caracteres en C
Publicado por: leosansan en 28 Septiembre 2012, 18:06 pm
No es valido. Toda variable local inicia con un valor no definido o "basura", antes de utilizar ese puntero se debe almacenar en el una dirección valida ya sea mediante el operador "&" (no necesario en el caso de arrays) o el valor de retorno de malloc/calloc/realloc.
Como ves, si no es con array llegamos a punteros.
Más o menos, algo así:
Código
  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. char *nombre;
  6. nombre = (char *)malloc (80*sizeof(char));
  7. char *saludo = "buenos dias";
  8. printf("por favor ingrese su nombre \n");
  9. fgets (nombre, 100,stdin);
  10. printf("%s %s",saludo,nombre);
  11. return 0;
  12. }
  13.  
Utilizo fgets porque se sobreentiende que al introducir nombre y apellido van a ir separados por un espacio en blanco, cosa que no consigues con el scanf tal como lo tienes. Lo considero más fácil que con variantes de scanf.
Un saludoPD:Reditado


Título: Re: Duda de cadena de caracteres en C
Publicado por: rir3760 en 28 Septiembre 2012, 18:31 pm
Como ves, si no es con array llegamos a punteros.
Más o menos, algo así:
Código
  1. #include <stdio.h>
  2.  
  3. /* ... */
  4.  
  5. nombre = (char *)malloc (80*sizeof(char));
Tres comentarios en relación al programa:

1) Antes de utilizar la función "malloc" debes incluir su prototipo mediante la inclusión de <stdlib.h>.

2) No es necesario convertir el valor de retorno de "malloc" al tipo "apropiado", un valor de tipo "void *" puede almacenarse de forma directa en una variable de cualquier tipo (por supuesto siempre que el tipo sea un "puntero a objeto").

3) La multiplicación esta de mas ya que "sizeof(char)" siempre es igual a uno.

Un saludo


Título: Re: Duda de cadena de caracteres en C
Publicado por: leosansan en 28 Septiembre 2012, 19:21 pm
Citar
Gracias por las observaciones rir, Como siempre que respondes, aprendo o tengo presente algo nuevo.
 Habrás observado que te hice caso en lo del uso de fgets frente a gets.
 Lo de "sizeof(char)" es para que Ixcal lo "vea mejor. Así en caso de tratarse de un int, float o double tenga presente su uso.

Un saludo
PD: Reedite el post anterior para tener en cuenta lo de stdlib.


Título: Re: Duda de cadena de caracteres en C
Publicado por: 0xDani en 28 Septiembre 2012, 20:30 pm
Reservas 80 bytes para nombre, y permites que se ingresen 100 caracteres con fgets().


Título: Re: Duda de cadena de caracteres en C
Publicado por: leosansan en 28 Septiembre 2012, 21:38 pm
Reservas 80 bytes para nombre, y permites que se ingresen 100 caracteres con fgets().
LAS PRISAS SON MALAS CONSEJERAS.
Código
  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. char *nombre;
  6. nombre = (char *)malloc (100*sizeof(char));
  7. char *saludo = "buenos dias";
  8. printf("por favor ingrese su nombre \n");
  9.    fgets (nombre, 100,stdin);
  10. printf("%s %s",saludo,nombre);
  11. return 0;
  12. }
Espero ir más tranquilo para no pifiarla en esas tonterias.
Gracias y un saludo!


Título: Re: Duda de cadena de caracteres en C
Publicado por: elkiy en 28 Septiembre 2012, 22:17 pm
pues pone esto:
#include <string>
using std::string;
using std::getline;

bueno despues de eso creas una variable, asi:

string miNombre;
después:
cout << "escribe tu nombre: ";
getline(cin, miNombre);
cout << endl;

Y listo. Para imprimir tu nombre:

cout << "bienvenido!! " << miNombre;


Título: Re: Duda de cadena de caracteres en C
Publicado por: Ixcal en 28 Septiembre 2012, 22:28 pm
Gracias a todos por las respuestas, solo quería saber si era posible guardar una cadena de caracteres en C sin un arreglo. El código que realizé quedo algo como esto:

Código:
#include<stdio.h>

main()
 {char nomap[80];
     
     printf("Por favor, ingresa tu nombre y tu apellido: ");
     gets(nomap);
     printf("\n Hola %s recibe un cordial saludo (^-^)",nomap);
     fflush(stdin);
     getchar();
     return 0;
 } 

Pero he estado leyendo por el foro que la función fflush no es conveniente usarla en los programas, entonces ¿Está mal que la use en mi código?. La uso con getchar(); para hacer una pausa porque en el DevC++ se cierra una vez que ingreso el nombre y apellido. Estuve viendo lo de usar fgets y sscanf pero es demasiado complicado para mi xD.


Título: Re: Duda de cadena de caracteres en C
Publicado por: leosansan en 28 Septiembre 2012, 23:05 pm
he estado leyendo por el foro que la función fflush no es conveniente usarla en los programas, entonces ¿Está mal que la use en mi código?.
En este caso está de más. Prueba a quitarla. Otra cosa sería si usaras scanf.