Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 1 Abril 2014, 02:23 am



Título: duda con arreglo de caracteres
Publicado por: m@o_614 en 1 Abril 2014, 02:23 am
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'};


Título: Re: duda con arreglo de caracteres
Publicado por: razormta en 1 Abril 2014, 04:20 am
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
  1. char str[10];
  2.  
  3. strcpy( str, "test");
  4.  
  5. std::cout<<str<<std::endl;

imprimira : test
y si hago

Código
  1. str[2] = '\0';
  2.  
  3. 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


Título: Re: duda con arreglo de caracteres
Publicado por: rir3760 en 1 Abril 2014, 04:42 am
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?
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


Título: Re: duda con arreglo de caracteres
Publicado por: m@o_614 en 1 Abril 2014, 17:30 pm
muchas gracias por sus respuestas

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

Código
  1. char *obtenerInstruccion(char *operando,int x)
  2. {
  3.    int i;
  4.    char *cadena = NULL,c[2];
  5.    cadena = calloc(7,sizeof(char));
  6.    for(i = x;operando[i] != ',';i++)
  7.    {
  8.        sprintf(c,"%c",operando[i]);
  9.        strcat(cadena,c);
  10.    }
  11.    return cadena;
  12. }

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


Título: Re: duda con arreglo de caracteres
Publicado por: 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


Título: Re: duda con arreglo de caracteres
Publicado por: amchacon en 1 Abril 2014, 18:49 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.


Título: Re: duda con arreglo de caracteres
Publicado por: rir3760 en 2 Abril 2014, 19:22 pm
El arreglo lo necesito para una función como esta:

Código
  1. char *obtenerInstruccion(char *operando,int x)
  2. {
  3.    int i;
  4.    char *cadena = NULL,c[2];
  5.    cadena = calloc(7,sizeof(char));
  6.    for(i = x;operando[i] != ',';i++)
  7.    {
  8.        sprintf(c,"%c",operando[i]);
  9.        strcat(cadena,c);
  10.    }
  11.    return cadena;
  12. }

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:
Código
  1. char *obtenerInstruccion(char *oper)
  2. {
  3.   char *rv;
  4.   int i;
  5.   int j;
  6.  
  7.   for (i = 0; oper[i] != '\0' && oper[i] != ','; i++)
  8.      ;
  9.  
  10.   if (i == 0)
  11.      rv = NULL;
  12.   else if ((rv = malloc(i + 1)) != NULL){
  13.      for (j = 0; j < i; j++)
  14.         rv[j] = oper[j];
  15.      rv[j] = '\0';
  16.   }
  17.  
  18.   return rv;
  19. }

Y utilizando funciones de la biblioteca estándar de C:
Código
  1. char *obtenerInstruccion(char *oper)
  2. {
  3.   char *rv;
  4.   size_t i = strcspn(oper, ",");
  5.  
  6.   if (i == 0)
  7.      rv = NULL;
  8.   else if ((rv = malloc(i + 1)) != NULL)
  9.      sprintf(rv, "%.*s", i, oper);
  10.  
  11.   return rv;
  12. }
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