Duda de cadena de caracteres en C

Iniciado por Ixcal, 27 Septiembre 2012, 23:22 PM

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

Ixcal

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.


avesudra

#1
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.
Regístrate en

leosansan

#2
Cita de: Ixcal en 27 Septiembre 2012, 23:22 PM
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.
CitarHasta ahí todo bien.
CitarAsí 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!.

Caster

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

yoxter

Saludos creo que esto lo que buscas

#include <stdio.h>

int main() {

char *nombre;
char *saludo = "buenos dias";

printf("por favor ingrese su nombre \n");
scanf("%s", nombre);


printf("%s %s",saludo,nombre);



return 0;
}



Posiblemente soy el intento de programador mas fracaso de la historia !!

rir3760

Cita de: yoxter en 28 Septiembre 2012, 00:54 AM
Saludos creo que esto lo que buscas

char *nombre;

/* ... */

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
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

leosansan

#6
Cita de: rir3760 en 28 Septiembre 2012, 02:05 AM
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í:
#include <stdio.h>
#include<stdlib.h>
int main()
{
char *nombre;
nombre = (char *)malloc (80*sizeof(char));
char *saludo = "buenos dias";
printf("por favor ingrese su nombre \n");
fgets (nombre, 100,stdin);
printf("%s %s",saludo,nombre);
return 0;
}

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

rir3760

Cita de: leosansan en 28 Septiembre 2012, 18:06 PMComo ves, si no es con array llegamos a punteros.
Más o menos, algo así:
#include <stdio.h>

/* ... */

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
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

leosansan

CitarGracias 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.

0xDani

Reservas 80 bytes para nombre, y permites que se ingresen 100 caracteres con fgets().
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM