Como manejar cadenas en c??

Iniciado por rod00x3, 6 Febrero 2013, 20:27 PM

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

rod00x3

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

avesudra

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.

char cadena[] = "Texto que desees";
int i;
for( i = 0 ; cadena [i] != '\0' ; i++ )
{
 cadena[i] = 0;
}

También puedes hacer esto ( sustituye strlen -1 carácteres de cadena por  0's ):

#include <string.h>
#include <stdio.h>

int main ( int argc, char *argv[] )
{
 char cadena[]="Texto que desees";
 memset ( cadena , 0 , strlen ( cadena ) - 1 );
 return 0;
}


¡Un saludo!
Regístrate en

TopoJunior

No sé si te refieres a esto :SSS Pero por ejemplo una forma de declararlas es:::
#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!!!

leosansan

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:


#include <string.h>
#include <stdio.h>

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


Saluditos!.

rod00x3

Muchas gracias por sus respuestas ahorita mismo checo y les aviso como me fue gracias.

rod00x3

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


rir3760

Cita de: rod00x3 en  7 Febrero 2013, 18:03 PMPara 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:
cadena[0] = '\0';

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


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

rod00x3

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.

avesudra

#8
Cita de: rir3760 en  7 Febrero 2013, 18:59 PM
No tiene caso utilizar memset en la forma indicada ya que tiene el mismo efecto que la asignación:
cadena[0] = '\0';

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


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:
int p = 12;
char cad[100];
memset(cad, 0, 100);
sprintf(cad, "El numero actual es: %dapresiamos", p);
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!
Regístrate en

leosansan

Tienes que pasar el entero a cadena, versus ascii:
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

int main()
{
int p=12;
char valor[10];
char cad[100]={0};
valor[10]=itoa (p,valor,10);
strcat(cad,"El numero actual es: ");
strcat(cad,valor);
strcat(cad,"apresiamos");
printf("%s",cad);
return 0;
}

Saluditos!.