2012-06-29 18 views
7

Tengo un char que se da desde fgets, y me gustaría saber cómo puedo convertirlo en char*.C Convertir char en char *

Estoy seguro de que esto se ha publicado anteriormente, pero no pude encontrar uno que hiciera todo lo que quería hacer. Cualquier respuesta es apreciada.

EDITAR: Aquí está el código.

char *filename = "file.txt"; 
FILE *file = fopen(filename, "r"); 
if(file != NULL) { 
    char line[260]; 
    char *fl; 
    while(fgets(line, sizeof line, file) != NULL) { 
    // here I combine some strings with the 'line' variable. 
    str_replace(line, "\"", "\"\""); // A custom function, but it only takes char*'s. 
    } 
    printf(fl); 
    printf("\n"); 
} else { 
    printf(" -- *ERROR* Couldn't open file.\n"); 
} 
+15

No, no es así. 'fgets()' devuelve un resultado 'char *', no un 'char'. Por favor, dennos una mejor idea de lo que está tratando de hacer, preferiblemente publicando algún código real. –

+0

Oh. Mi error. Eso significa que ya no necesito esta pregunta. – Matthew

+0

Luego puede (y debe) eliminar la pregunta usted mismo. –

Respuesta

16

Bueno, en primer lugar, line es una matriz de char s y así se puede manipular de la misma manera como char * (Ver comp.lang.c FAQs de las diferencias importantes), por lo que no tiene que preocuparse acerca eso.

Sin embargo, en caso de que quiera una respuesta a la pregunta general ...

El operador & es lo que necesita:

char c; 
char *pChar = &c; 

Sin embargo, tenga en cuenta que PChar es un puntero a la char y solo será válido mientras c esté dentro del alcance. Eso significa que no puede devolver pChar desde una función y esperar que funcione; señalará una parte del montón y no puede esperar que siga siendo válido.

Si quieres pasarlo como un valor de retorno, tendrá que malloc algo de memoria y luego usar el puntero para escribir el valor de c:

char c; 
char *pChar = malloc(sizeof(char)); 

/* check pChar is not null */ 

*pChar = c; 
+0

"' line' es un 'char *', ya que es una matriz de 'char's" - No, las matrices no son punteros. Lea la sección 6 de las [preguntas frecuentes de comp.lang.c] (http://www.c-faq.com). –

+0

@KeithThompson: "... aunque están estrechamente relacionados". [Pregunta 6.2] (http://www.c-faq.com/aryptr/aryptr2.html) – Dancrumb

+0

La pregunta 6.2 deja muy claro que son conceptos completamente distintos. Sí, están estrechamente relacionados; también hay muchos conceptos en cualquier lenguaje de programación. Existe una idea generalizada errónea de que las matrices en C son realmente indicadores; no lo agreguemos. –

4

Usando el operador & le dará un puntero al personaje, como mencionó Dancrumb, pero existe el problema del alcance que le impide devolver el puntero, también como él lo mencionó.

Una cosa que tengo que agregar es que me imagino que la razón por la que desea un char* es para que pueda usarlo como una cadena en printf o algo similar. No puede usarlo de esta manera porque la cadena no será NULL terminada. Para convertir un char en una cadena, tendrá que hacer algo como

char c = 'a'; 
char *ptr = malloc(2*sizeof(char)); 
ptr[0] = c; 
ptr[1] = '\0'; 

No se olvide de liberar ptr más tarde!

+1

argumento malloc: 'sizeof (char)' es '1' por std; solo puede escribir: 'malloc (2)' que es equivalente a. – Jack

+0

@Jack, ¿hay alguna razón en particular para hacer eso, sin embargo, en lugar de seguir la fórmula habitual de usar 'sizeof'? – Daniel

+0

Parece innecesariamente prolijo convertir un recuento de caracteres en un recuento de bytes cuando el mandato de caracteres es un byte. ¿Escribirías 'malloc ((strlen (foo) +1) * sizeof (char))' al asignar espacio para una copia de 'foo'? En cualquier caso, prefiero 'foo = malloc (n * sizeof * foo)', que funciona independientemente del tipo de foo. –