Convertir Char a String en C

4 minutos de lectura

avatar de usuario
usuario1911575

¿Cómo convierto un carácter en una cadena en C? Actualmente estoy usando c = fgetc(fp) que devuelve un carácter. Pero necesito una cadena para usar en strcpy

  • Almacene todos los caracteres en una matriz y luego almacene \0 como último elemento de la matriz. Eso es todo.

    – trucos

    24/03/2014 a las 22:33


  • ¿Podría ser más específico? Según su descripción, podría intentar algo como fscanf(pf, "%s", &buf).

    – gongzhitaao

    24/03/2014 a las 22:34


  • intc; c=fgetc(fp)//obtener carácter por carácter del archivo y necesito poder hacer strcpy(buffer,c);

    – usuario1911575

    24/03/2014 a las 22:36


  • ¿Por qué necesitas usarlo con strcpy()¿exactamente?

    – Heeryu

    24/03/2014 a las 22:45

  • Estoy asombrado de cuánto tráfico y debate ha generado esta simple pregunta. La solución son dos líneas de código. DOS. Estoy votando a favor de la pregunta simplemente porque hizo que un montón de profesionales cayeran sobre sí mismos.

    – Carey Gregorio

    25 de marzo de 2014 a las 1:45


Para responder a la pregunta sin leer demasiado más, lo haría

char str[2] = "\0"; /* gives {\0, \0} */
str[0] = fgetc(fp);

Puede usar la segunda línea en un bucle con cualquier otra operación de cadena que desee seguir usando char como cadenas.

avatar de usuario
Liho

Usando fgetc(fp) solo para poder llamar strcpy(buffer,c); no parece correcto

Simplemente podría construir este búfer por su cuenta:

char buffer[MAX_SIZE_OF_MY_BUFFER];

int i = 0;
char ch;
while (i < MAX_SIZE_OF_MY_BUFFER - 1 && (ch = fgetc(fp)) != EOF) {
    buffer[i++] = ch;
}
buffer[i] = '\0';  // terminating character

Tenga en cuenta que esto se basa en el hecho de que leerá menos de MAX_SIZE_OF_MY_BUFFER caracteres

Podría hacer muchas de las respuestas dadas, pero si solo quiere hacerlo para poder usarlo con strcpyentonces podría hacer lo siguiente:

...
    strcpy( ... , (char[2]) { (char) c, '\0' } );
...

los (char[2]) { (char) c, '\0' } parte generará temporalmente una cadena terminada en nulo a partir de un carácter c.

De esta manera podría evitar crear nuevas variables para algo que ya tiene en sus manos, siempre que solo necesite eso. cadena de un solo carácter sólo una vez.

  • Esa es la forma sintácticamente más oscura de copiar una cadena que puedo imaginar. No es lo que le sugeriría a un novato.

    – Carey Gregorio

    24/03/2014 a las 23:10

  • @CareyGregory Estoy de acuerdo con eso, pero creo que mi explicación es breve y comprensible; haciéndolo lo suficientemente no tan oscuro para cualquiera.

    – Utkan Gezer

    24/03/2014 a las 23:15


  • Excelente sugerencia, pero ahora, (MSVC: compilando como C++) da: “C4576: un tipo entre paréntesis seguido de una lista de inicializadores es una sintaxis de conversión de tipo explícita no estándar”. Explicado un poco aquí.

    –Laurie Stearn

    26 de enero de 2019 a las 14:02


Lo uso para convertir caracteres en cadenas (un ejemplo):

char c="A";
char str1[2] = {c , '\0'};
char str2[5] = "";
strcpy(str2,str1);

avatar de usuario
Taiki

Un código como ese debería funcionar:

int i = 0;
char string[256], c;
while(i < 256 - 1 && (c = fgetc(fp) != EOF)) //Keep space for the final \0
{
    string[i++] = c;
}
string[i] = '\0';

  • es mejor escribir '\0' más bien que 0 ya que '\0' expresa explícitamente que “estoy asignando el carácter de terminación aquí”.

    – Liho

    24 de marzo de 2014 a las 23:06

  • Creo que el estándar C menciona 0 en lugar de ‘\0’, que simplemente se interpreta como 0, pero supongo que depende de su estilo de codificación. Últimamente manipulé mucho las cadenas y me acostumbré a 0, ya que es más rápido de escribir ^^

    – Taiki

    24/03/2014 a las 23:10

//example
char character;//to be scanned
char merge[2];// this is just temporary array to merge with      
merge[0] = character;
merge[1] = '\0';
//now you have changed it into a string

  • es mejor escribir '\0' más bien que 0 ya que '\0' expresa explícitamente que “estoy asignando el carácter de terminación aquí”.

    – Liho

    24 de marzo de 2014 a las 23:06

  • Creo que el estándar C menciona 0 en lugar de ‘\0’, que simplemente se interpreta como 0, pero supongo que depende de su estilo de codificación. Últimamente manipulé mucho las cadenas y me acostumbré a 0, ya que es más rápido de escribir ^^

    – Taiki

    24/03/2014 a las 23:10

avatar de usuario
floriel

Esta es una pregunta antigua, pero diría que ninguna de las respuestas realmente se ajusta a la pregunta del OP. Todo lo que quería/necesitaba hacer era esto:

char c = std::fgetc(fp);
std::strcpy(buffer, &c);

El aspecto relevante aquí es el hecho de que el segundo argumento de strcpy() no necesita ser una matriz de caracteres/c-string. De hecho, ninguno de los argumentos es un char o una matriz char. Ambos son punteros char:

strcpy(char* dest, const char* src);
dest : Un puntero de carácter no constante
Su valor tiene que ser la dirección de memoria de un elemento de una matriz de caracteres de escritura (con al menos un elemento más después de eso).

src : Un puntero de carácter constante

Su valor puede ser la dirección de un solo carácter o de un elemento en una matriz de caracteres. Esa matriz debe contener el carácter especial \0 dentro de sus elementos restantes (comenzando con src), para marcar el final de la cadena c que debe copiarse.

¿Ha sido útil esta solución?