2012-06-29 4 views
7

У меня есть char, который дается от fgets, и я хотел бы знать, как я могу преобразовать его в char*.C Преобразование char в char *

Я уверен, что это было опубликовано ранее, но я не мог найти тот, который делал то, что я хотел сделать. Любой ответ приветствуется.

EDIT: Вот код.

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

Нет, нет. 'fgets()' возвращает результат 'char *', а не 'char'. Пожалуйста, дайте нам лучшее представление о том, что вы пытаетесь сделать, предпочтительно, разместив некоторый фактический код. –

+0

Ох. Виноват. Это означает, что мне больше не нужен этот вопрос. – Matthew

+0

Тогда вы можете (и должны) удалить вопрос самостоятельно. –

ответ

16

Ну, в первую очередь, line является массивом char с и так можно манипулировать так же, как char * (См comp.lang.c FAQs для важных отличий), так что вам не нужно беспокоиться о Это.

Однако, в случае, если вы хотите получить ответ на общий вопрос ...

Оператор & это то, что вам нужно:

char c; 
char *pChar = &c; 

Однако, имейте в виду, что PChar является указателем на char и будет действителен только в том случае, если c находится в области видимости. Это означает, что вы не можете вернуть pChar из функции и ожидать, что она будет работать; он будет указывать на часть кучи, и вы не можете ожидать, что это останется действительным.

Если вы хотите, чтобы передать его в качестве возвращаемого значения, вам нужно будет таНос некоторую память, а затем использовать указатель, чтобы записать значение в C:

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

/* check pChar is not null */ 

*pChar = c; 
+0

«' '' '' 'char *', так как это массив 'char' - Нет, массивы не являются указателями. Прочтите раздел 6 [comp.lang.c FAQ] (http://www.c-faq.com). –

+0

@ KeithThompson: «... хотя они тесно связаны». [Вопрос 6.2] (http://www.c-faq.com/aryptr/aryptr2.html) – Dancrumb

+0

В вопросе 6.2 ясно сказано, что это совершенно разные понятия. Да, они тесно связаны; так много концепций на любом языке программирования. Существует распространенное заблуждение, что массивы C являются действительно указателями; давайте не будем добавлять к нему. –

4

Использование оператора & даст вам указатель к персонажу, как отметил Данкрум, но есть проблема сферы, которая мешает вам вернуть указатель, также, как он упомянул.

Одна вещь, которую я должен добавить, это то, что я предполагаю, что причина, по которой вы хотите char*, состоит в том, что вы можете использовать ее как строку в printf или что-то подобное. Вы не можете использовать его таким образом, потому что строка не будет NULL завершена. Чтобы преобразовать char в строку, то вам нужно сделать что-то вроде

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

Не забудьте освободить ptr позже!

+1

malloc argument: 'sizeof (char)' is '1' by std; вы можете написать только: 'malloc (2)', что эквивалентно. – Jack

+0

@Jack, есть ли какая-то особая причина сделать это, а не следовать обычной формуле использования 'sizeof'? – Daniel

+0

Кажется излишне подробным преобразовать количество символов в число байтов, когда char назначен байт. Вы писали бы 'malloc ((strlen (foo) +1) * sizeof (char))' при распределении пространства для копии 'foo'? В любом случае, я предпочитаю 'foo = malloc (n * sizeof * foo)', который работает независимо от типа foo. –

Смежные вопросы