2010-02-27 17 views
5

mi problema es convertir un char a cadena tengo que pasar a strcat() un char para anexar a una cadena, ¿cómo puedo hacer? gracias!C char a string (pasando char a strcat())

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

char *asd(char* in, char *out){ 
    while(*in){ 
     strcat(out, *in); // <-- err arg 2 makes pointer from integer without a cast 
     *in++; 
    } 
    return out; 
} 

int main(){ 
    char st[] = "text"; 
    char ok[200]; 
    asd(st, ok); 
    printf("%s", ok); 
    return 0; 
} 

Respuesta

5

Desde ok está apuntando a un array de caracteres sin inicializar, todo habrá valores de basura, por lo que si no se conoce la concatenación (por strcat) se iniciará. También strcat toma una C-cadena (es decir, una matriz de caracteres que termina con un carácter '\ 0'). Dando char a[200] = "" le dará a [0] = '\ 0', entonces un [1] a una [199] ajustado a 0.

Editar: (añadido la versión corregida del código)

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

char *asd(char* in, char *out) 
{ 

/* 
    It is incorrect to pass `*in` since it'll give only the character pointed to 
    by `in`; passing `in` will give the starting address of the array to strcat 
*/ 

    strcat(out, in); 
    return out; 
} 

int main(){ 
    char st[] = "text"; 
    char ok[200] = "somevalue"; /* 's', 'o', 'm', 'e', 'v', 'a', 'l', 'u', 'e', '\0' */ 
    asd(st, ok); 
    printf("%s", ok); 
    return 0; 
} 
3

strcat no adjuntará caracteres individuales. En cambio, toma un const char* (una cadena de estilo C completa) que se agrega a la cadena en el primer parámetro. Por lo que su función debe leer algo como:

char *asd(char* in, char *out) 
{ 
    char *end = out + strlen(out); 

    do 
    { 
     *end++ = *in; 

    } while(*in++); 

    return out; 
} 

El bucle do-while incluirá el cero terminador que sea necesario, al final de cadenas estilo C. Asegúrese de que su cadena externa se inicializa con un terminador cero al final o este ejemplo fallará.

Y a un lado: piense en lo que *in++; hace. Aumentará in y lo desreferenciará, que es lo mismo que in++, por lo que * es inútil.

1

para mirar a su código, puedo hacer un par de punteros en relación con ella, esto no es una crítica, tomar esto con una pizca de sal que le permitirá ser un mejor programador C:

  • Sin prototipo de función.
  • Uso incorrecto de los punteros
  • El manejo de la función strcat se usa incorrectamente.
  • Exageración - no es necesario para la función asd sí mismo!
  • Uso de tratar con variables notablemente char matriz que no se ha inicializado correctamente.
 
#include <stdio.h> 
#include <string.h> 

int main(){ 
    char st[] = "text"; 
    char ok[200]; 
    ok[0] = '\0'; /* OR 
    memset(ok, 0, sizeof(ok)); 
    */ 
    strcat(ok, st); 
    printf("%s", ok); 
    return 0; 
} 

Espero que esto ayude, Saludos cordiales, Tom .

+0

Uso de la función "asd" permite asd para ser utilizado en otros contextos, permitiendo que main ignore el cálculo detrás de asd. Siempre optaría por una función, cualquiera que sea el caso. –

+0

Además, su memset() es completamente irrelevante, simplemente declare lo siguiente: char ok [200] = {0}; –

+0

@rogue: Puedes hacerlo de esa manera si quieres, sin medios explícitos, ni a tu manera ni a la manera que he mencionado, fíjate en el marcador de comentarios O y en el memset ... ¡De cualquier manera depende de tu estilo! – t0mm13b

0

Para convertir un carácter en una cadena (terminada en nulo) que podría simplemente hacer:

char* ctos(char c) 
{ 
    char s[2]; 
    sprintf(s, "%c\0", c); 
    return s; 
} 

Ejemplo de trabajo: http://ideone.com/Cfav3e

+0

No funciona ya que 'c' todavía es de tipo' char'. 'sprintf' espera trabajar con cadenas. – skytreader

+0

Esto parece funcionar, en realidad. 'sprintf' puede tomar un argumento de carácter si está rellenando un'% c' en la cadena de formato. –