2012-06-29 18 views
7

Mam char, który jest podany z fgets, i chciałbym wiedzieć, jak mogę przekonwertować go na char*.C Konwertuj char na char *

Jestem pewien, że zostało to opublikowane wcześniej, ale nie mogłem znaleźć takiego, który robił to, co chciałem. Każda odpowiedź jest doceniana.

EDYCJA: Oto kod.

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

Nie, nie robisz tego. 'fgets()' zwraca wynik 'char *', a nie 'char'. Daj nam lepsze wyobrażenie o tym, co próbujesz zrobić, najlepiej przez zamieszczenie prawdziwego kodu. –

+0

Oh. Mój błąd. Oznacza to, że nie potrzebuję już tego pytania. – Matthew

+0

Następnie możesz (i powinieneś) samemu usunąć to pytanie. –

Odpowiedz

16

Cóż, przede wszystkim, line jest tablicą char s, a więc można manipulować w taki sam sposób jak char * (patrz comp.lang.c FAQs dla istotnych różnic), więc nie trzeba się martwić to.

Jednak w przypadku, gdy chcesz odpowiedzi na ogólne pytanie ...

Operator & jest to, czego potrzebujesz:

char c; 
char *pChar = &c; 

jednak pamiętać, że PChar jest wskaźnik do char i będzie ważny tylko wtedy, gdy c jest w zasięgu. Oznacza to, że nie można zwrócić pChar z funkcji i oczekiwać, że zadziała; będzie wskazywał na pewną część sterty i nie możesz oczekiwać, że pozostanie ważna.

Jeśli chcesz przekazać go jako wartość zwracana, trzeba będzie malloc trochę pamięci, a następnie użyć wskaźnika napisać wartość C:

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

/* check pChar is not null */ 

*pChar = c; 
+0

"' linia' to "char *", ponieważ jest to tablica 'char's" - Nie, tablice nie są wskaźnikami. Przeczytaj sekcję 6 w [comp.lang.c FAQ] (http://www.c-faq.com). –

+0

@KeithThompson: "... chociaż są ze sobą blisko spokrewnione". [Pytanie 6.2] (http://www.c-faq.com/aryptr/aryptr2.html) – Dancrumb

+0

Pytanie 6.2 jasno pokazuje, że są to całkowicie odrębne pojęcia. Tak, są blisko spokrewnieni; więc jest wiele koncepcji w dowolnym języku programowania. Istnieje powszechne błędne przekonanie, że tablice C są naprawdę wskazówkami; nie dodawajmy do tego. –

4

pomocą operatora & daje wskaźnik do postaci, jak wspomniał Dancrumb, ale jest problem z zakresem uniemożliwiającym ci zwrócenie wskaźnika, jak również wspomniał.

Jedną rzeczą, którą muszę dodać, jest to, że wyobrażam sobie, że powodem, dla którego chcesz char*, jest użycie go jako łańcucha znaków w printf lub coś podobnego. Nie można go użyć w ten sposób, ponieważ ciąg znaków nie zostanie zakończony NULL. Aby przekonwertować char na sznurku, trzeba będzie coś zrobić jak

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

Nie zapomnij zwolnić ptr później!

+1

argument malloc: 'sizeof (char)' jest '1' przez std; możesz napisać tylko: 'malloc (2)', który jest równoważny. – Jack

+0

@Jack, czy jest jakiś szczególny powód, aby to zrobić, zamiast podążać za zwykłą formułą używania 'sizeof'? – Daniel

+0

Wydaje się niepotrzebnie szczegółowe przekształcenie liczby znaków w liczbę bajtów, gdy znak ma być bajtem. Czy podczas przydzielania miejsca dla kopii 'foo' napisałeś' malloc ((strlen (foo) +1) * sizeof (char)) '? W każdym razie wolę 'foo = malloc (n * sizeof * foo)', który działa niezależnie od typu foo. –