duda con arreglo de caracteres

Iniciado por m@o_614, 1 Abril 2014, 02:23 AM

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

m@o_614

Saludos

si yo quiero declarar un arreglo de 2 caracteres que sean:

char arreglo[] = {'\0',','};

uno que es una coma, y el otro que es el simbolo de fin de cadena, pero me dicen que al declarar un arreglo de caracteres al final se le tiene que poner precisamente el simbolo '\0', entonces tendria yo que poner a fuerzas otro signo de fin de linea??

char arreglo[] = {'\0',',','\0'};

razormta

#1
creo que entiendo tu pregunta y mmmm no se, creo que si he llegado a poner signo  de fin de cadena antes de que llegue al verdadero signo de fin de cadena ( '\0' ) mmm pero no recuerdo que paso y me da pereza ir al compilador a ver xd , porque no intentas verlo por tu cuenta ?

lo que yo suponto que pasara que que por ejemplo ...

Código (cpp) [Seleccionar]
char str[10];

strcpy( str, "test");

std::cout<<str<<std::endl;


imprimira : test
y si hago

Código (cpp) [Seleccionar]
str[2] = '\0';

std::cout<<str<<std::endl;


imprimira: te

haha por logica es lo que pienso que sucedera, pero tengo tiempo sin trabajar con cadena de caracteres xd

si mi teoria es cierto entonces, tienes un string : { 'a', '\0', 'b' , '\0' }

si lo imprimes en pantalla deberia mostrar: a

pero bueno ... intentalo a ver xd

rir3760

Cita de: m@o_614 en  1 Abril 2014, 02:23 AMme dicen que al declarar un arreglo de caracteres al final se le tiene que poner precisamente el simbolo '\0', entonces tendria yo que poner a fuerzas otro signo de fin de linea?
Hay que diferenciar entre contenedor (array de caracteres) y contenido (cadena siendo esta una secuencia de caracteres seguida de un '\0').

Si solo quieres almacenar caracteres para un uso posterior no necesitas el '\0' pero si piensas procesar su contenido como una cadena (por ejemplo con las funciones de la biblioteca estándar de C) debes asegurarte de que ese carácter este ahí para marcar el final de ella.

En resumen es necesario o no dependiendo del uso del array (algo que no indicas).

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

m@o_614

muchas gracias por sus respuestas

El arreglo lo necesito para una función como esta:

char *obtenerInstruccion(char *operando,int x)
{
    int i;
    char *cadena = NULL,c[2];
    cadena = calloc(7,sizeof(char));
    for(i = x;operando[i] != ',';i++)
    {
        sprintf(c,"%c",operando[i]);
        strcat(cadena,c);
    }
    return cadena;
}


para que en la condicion operando != aqui pueda ser o '\0' o la coma

ivancea96

Si te sirve de algo, mi recomendación es que no uses el caracter 0 como indicador. Usa otro. Recuerda que hay 255 caracteres más jaja

amchacon

#5
Cita de: ivancea96 en  1 Abril 2014, 18:08 PM
Si te sirve de algo, mi recomendación es que no uses el caracter 0 como indicador. Usa otro. Recuerda que hay 255 caracteres más jaja
Eres el chapuzas, luego cuando vayas a hacer un printf o usar una función de la librería estandar la lías parda xD.

@mo_614: Lo que quieres hacer esta implementado ya por la función: strtok()
http://c.conclase.net/librerias/?ansifun=strtok

Más bonito y elegante que eso no vas a encontrar. Le pasas como token la coma y te saca las "subcadenas" en cada llamada.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

Cita de: m@o_614 en  1 Abril 2014, 17:30 PMEl arreglo lo necesito para una función como esta:

char *obtenerInstruccion(char *operando,int x)
{
    int i;
    char *cadena = NULL,c[2];
    cadena = calloc(7,sizeof(char));
    for(i = x;operando[i] != ',';i++)
    {
        sprintf(c,"%c",operando[i]);
        strcat(cadena,c);
    }
    return cadena;
}


para que en la condicion operando != aqui pueda ser o '\0' o la coma
Lo primero a recomendar (lo digo en buen plan) es darle un buen repaso a tu material de referencia porque hay (en este y otros mensajes) malas practicas:

* Inicializas la variable "cadena" a NULL pero lo primero que haces con ella es asignarle otro valor. Eso ultimo vuelve la inicializacion inútil, hay que eliminarla.

* El delimitador de cadena '\0' se puede agregar de forma manual o bien utilizando una función de la biblioteca estándar de C, hay que cambiar el uso de calloc por malloc.

* Das por sentado que la cadena resultante siempre tendrá menos de siete caracteres, no hay problema si ello lo tienes garantizado pero de no ser así el programa puede reventar.

* En cada iteración del bucle creas una cadena con un solo caracter mediante sprintf y después la copias con strcat. En otras palabras estas copiando caracteres y bien los copias en un bucle sin necesidad de esas dos funciones o utilizas una sola llamada a función.

El proceso de forma manual:
char *obtenerInstruccion(char *oper)
{
   char *rv;
   int i;
   int j;
   
   for (i = 0; oper[i] != '\0' && oper[i] != ','; i++)
      ;
   
   if (i == 0)
      rv = NULL;
   else if ((rv = malloc(i + 1)) != NULL){
      for (j = 0; j < i; j++)
         rv[j] = oper[j];
      rv[j] = '\0';
   }
   
   return rv;
}


Y utilizando funciones de la biblioteca estándar de C:
char *obtenerInstruccion(char *oper)
{
   char *rv;
   size_t i = strcspn(oper, ",");
   
   if (i == 0)
      rv = NULL;
   else if ((rv = malloc(i + 1)) != NULL)
      sprintf(rv, "%.*s", i, oper);
   
   return rv;
}

No es necesario pasar la dirección del array y el indice del elemento, en su lugar pasas directamente la dirección del elemento con "a + i" donde "a" es el array e "i" el indice del elemento donde inicia la búsqueda.


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