Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: rod00x3 en 6 Febrero 2013, 20:27 pm



Título: Como manejar cadenas en c??
Publicado por: rod00x3 en 6 Febrero 2013, 20:27 pm
Hola mi duda es sobre quisa lo mas facil pero nadamas no encuentro solucion
ya quedo claro que para manejar cadenas de caracteres solo hay que declararlas y deben terminar en nulo

segun la forma mas sencilla de declarar cadenas de caracteres es:

car cadena[]="Texto que desees";
Pero como puedo hacer para vacear la cadena?? es decir que esta ahora contenga

cadena=""

alguien podria audarme


Título: Re: Como manejar cadenas en c??
Publicado por: avesudra en 6 Febrero 2013, 20:38 pm
Mientras que la cadena en la posición i no sea igual que el final de línea (carácter nulo) , sustituye cadena en la posición i por 0.
Código
  1. char cadena[] = "Texto que desees";
  2. int i;
  3. for( i = 0 ; cadena [i] != '\0' ; i++ )
  4. {
  5.  cadena[i] = 0;
  6. }
También puedes hacer esto ( sustituye strlen -1 carácteres de cadena por  0's ):
Código
  1. #include <string.h>
  2. #include <stdio.h>
  3.  
  4. int main ( int argc, char *argv[] )
  5. {
  6.  char cadena[]="Texto que desees";
  7.  memset ( cadena , 0 , strlen ( cadena ) - 1 );
  8.  return 0;
  9. }

¡Un saludo!


Título: Re: Como manejar cadenas en c??
Publicado por: TopoJunior en 6 Febrero 2013, 21:14 pm
No sé si te refieres a esto :SSS Pero por ejemplo una forma de declararlas es:::
Código:
#include <stdio.h>
main()
{
      char cadena[10]; // Aquí ya declaras la cadena...
       gets(cadena);// Para que nos entendamos, aqui puedes escribir y los caracteres que escribas se almacenan en la cadena. Debes escribir menos de 10, porque pusiste [10] caracteres.
       printf("Has escrito esto. %s", cadena); // Aquí lo que haces es decir que %s lo sustituya por lo que almacenamos en la cadena, y pondra lo que escribiste
       while(1);
}
Espero que te sirva!!!


Título: Re: Como manejar cadenas en c??
Publicado por: leosansan en 7 Febrero 2013, 14:14 pm
En el caso del valor 0 no hace falta especificar número de caracteres a sustituir. Para cualquier valor distinto de cero se obtendrá la cedena nula:

Código
  1. #include <string.h>
  2. #include <stdio.h>
  3.  
  4. int main ( int argc, char *argv[] )
  5. {
  6.  char cadena[]="Texto que desees";
  7.  memset ( cadena , 0 , 1 ); /* <==aqui */
  8.  return 0;
  9. }

Saluditos!.


Título: Re: Como manejar cadenas en c??
Publicado por: rod00x3 en 7 Febrero 2013, 18:00 pm
Muchas gracias por sus respuestas ahorita mismo checo y les aviso como me fue gracias.


Título: Re: Como manejar cadenas en c??
Publicado por: rod00x3 en 7 Febrero 2013, 18:03 pm
Perdon me surgio una duda que no acabo de entender... segun el codigo:

int main ( int argc, char *argv[] )
{
 char cadena[]="Texto que desees";
 memset ( cadena , 0 , 1 ); /* <==aqui */
}

Para evaluar que la cadena es nula basta con un:

if(cadena==NULL){//hacer algo}

o tengo que evaluar de alguna otra forma??



Título: Re: Como manejar cadenas en c??
Publicado por: rir3760 en 7 Febrero 2013, 18:59 pm
Para evaluar que la cadena es nula basta con un:

if(cadena==NULL){//hacer algo}

o tengo que evaluar de alguna otra forma??
No tiene caso utilizar memset en la forma indicada ya que tiene el mismo efecto que la asignación:
Código
  1. cadena[0] = '\0';

Para verificar si el array almacena una cadena vacía basta con verificar el valor de su primer elemento:
Código
  1. if (cadena[0] == '\0'){
  2.   /* Cadena vacia */
  3. }else {
  4.   /* Al menos un caracter */
  5. }

Un saludo


Título: Re: Como manejar cadenas en c??
Publicado por: rod00x3 en 7 Febrero 2013, 19:27 pm
Dios gracias por sus respuestas es increible que algo tan importante no este tan documentado o no se alle en la web, todo lo que busco sobre cadenas en c me lleva a la libreria string.h
y solo son funciones de comparacion, y copiado, solo una duda mas,

tengo una variable tipo int, quiero convertirla en cadena y concatenarla a otra cadena
pero solo me muestra basura no el valor de la variable como tal. codigo:
...
int p=12;
char valor;
char cad[100];

valor=(char)p;

memset(cad,0,100);
strcat(cad,"El numero actual es: ");
strcat(cad,valor);
strcat(cad,"apresiamos");

printf("%s",cad);
...

Use lo anterior y funciono bien pero el problema se da con la concatenacion del entero
deberia desplegar:
    El numero actual es: 12apresiamos

Pero en lugar de eso despliega:
   El numero actual es: ??#$%"# (unos garabatos raros)apresiamos

De antemano gracias.


Título: Re: Como manejar cadenas en c??
Publicado por: avesudra en 7 Febrero 2013, 19:31 pm
No tiene caso utilizar memset en la forma indicada ya que tiene el mismo efecto que la asignación:
Código
  1. cadena[0] = '\0';

Para verificar si el array almacena una cadena vacía basta con verificar el valor de su primer elemento:
Código
  1. if (cadena[0] == '\0'){
  2.   /* Cadena vacia */
  3. }else {
  4.   /* Al menos un caracter */
  5. }

Un saludo
El mismo efecto no tiene, aparentemente sí, pero en cadena[1] sigue estando la 'e' y así sucesivamente hasta el carácter nulo de final de cadena. Depende de lo que quieras hacer con la cadena utilizas una u otra manera solo que la que dice rir3760 te sustituye el primer carácter por el final de línea, es obvio que la cadena quedaría vacía. Y yo  sustituyo todos los elementos del array por 0. Así que quedaría igual solo que rir3760 tiene en el primer elemento un 0 y en los demás lo mismo: Caracter Nulo + "exto que desees" + Caracter Nulo , y yo en todos un 0, ya depende de lo que quieras hacer después con la cadena.

EDITADO:
Para convertir de entero a cadena no puedes hacer un cast directamente tienes que utilizar por ejemplo la función sprintf:
Código
  1. int p = 12;
  2. char cad[100];
  3. memset(cad, 0, 100);
  4. sprintf(cad, "El numero actual es: %dapresiamos", p);
  5. printf("%s", cad);
Despliega unos garabatos raros porque un int no contiene los valores numericos como cadena, en una cadena, cada byte es una letra, en un int los 4 bytes conforman el número de 32 bits. Entonces al esperar strcat una cadena, se pone a buscar el carácter nulo y hasta que no lo encuentra te concatena carácteres raros.

¡Un saludo!


Título: Re: Como manejar cadenas en c??
Publicado por: leosansan en 7 Febrero 2013, 22:30 pm
Tienes que pasar el entero a cadena, versus ascii:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6. int p=12;
  7. char valor[10];
  8. char cad[100]={0};
  9. valor[10]=itoa (p,valor,10);
  10. strcat(cad,"El numero actual es: ");
  11. strcat(cad,valor);
  12. strcat(cad,"apresiamos");
  13. printf("%s",cad);
  14. return 0;
  15. }
  16.  
Saluditos!.


Título: Re: Como manejar cadenas en c??
Publicado por: avesudra en 7 Febrero 2013, 23:43 pm
Tienes que pasar el entero a cadena, versus ascii:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6. int p=12;
  7. char valor[10];
  8. char cad[100]={0};
  9. valor[10]=itoa (p,valor,10);
  10. strcat(cad,"El numero actual es: ");
  11. strcat(cad,valor);
  12. strcat(cad,"apresiamos");
  13. printf("%s",cad);
  14. return 0;
  15. }
  16.  
Saluditos!.
leosansan si te fijas esa función no está definida en el ANSI-C solo que es soportada por algunos compiladores así que es mejor no usarla. Mira aquí donde pone portabilidad:

http://www.cplusplus.com/reference/cstdlib/itoa/

¡Un saludo!


Título: Re: Como manejar cadenas en c??
Publicado por: rir3760 en 8 Febrero 2013, 01:44 am
El mismo efecto no tiene, aparentemente sí, pero en cadena[1] sigue estando la 'e' y así sucesivamente hasta el carácter nulo de final de cadena.
Mi comentario fue en respuesta al mensaje inmediatamente anterior (de rod00x3), en el utiliza esa función en la forma:
Código
  1. memset(cadena, 0, 1); /* <==aqui */
Por eso comente que no tiene caso utilizar una llamada a función cuando la asignación basta.

Solo un comentario, si lo primero que se piensa hacer con un array es almacenar en el una cadena:
Código
  1. memset(cad, 0, 100);
  2. sprintf(cad, "El numero actual es: %dapresiamos", p);
No es necesario colocar primero (con la función memset) todos los caracteres a cero.

Un saludo