2012-06-29 20 views
7

fgetsから与えられるcharがあります。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

まあ、linecharの配列ですので、あなたが心配する必要はありませんので、(重要な違いについてcomp.lang.c FAQsを参照してください)char *とほぼ同じ方法で操作することができますそれ。

しかし、あなたは一般的な質問への答えをしたい場合は...

&オペレータは何が必要です:

char c; 
char *pChar = &c; 

しかし、PChar型はへのポインタである念頭に置いてクマcharはスコープ内にある間のみ有効です。つまり、関数からpCharを返すことができず、関数が動作することを期待することはできません。ヒープの一部を指しているので、有効であると期待することはできません。

あなたは戻り値としてそれを渡したい場合は、あなたには、いくつかのメモリをmallocとその後、cの値を書き込むためにポインタを使用する必要があります。

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

/* check pChar is not null */ 

*pChar = c; 
+0

"' line'は 'char'sの配列なので' char * 'です - いいえ、配列はポインタではありません。 [comp.lang.c FAQ](http://www.c-faq.com)のセクション6を読んでください。 –

+0

@KeithThompson: "...彼らは密接に関連していますが"。 [Question 6.2](http://www.c-faq.com/aryptr/aryptr2.html) – Dancrumb

+0

質問6.2は全く別の概念であることを明確にしています。はい、彼らは密接に関連しています。どんなプログラミング言語でも多くの概念があります。 C配列は実際にはポインタであるという誤解が広まっています。それに追加しません。 –

4

&演算子を使用すると、あなたにポインタを与えますDancrumbが言及したように、キャラクタには、ポインタが返されるのを防ぐスコープの問題があります。

私が追加しなければならないことの1つは、char*が欲しい理由がprintfなどの文字列として使用できると想像していることです。文字列はNULLで終了しないため、この方法では使用できません。文字列にcharを変換するには、

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

のような何かをする必要がありますptr後に解放することを忘れないでください!

+1

malloc引数: 'sizeof(char)'はstdによって '1'です; 'malloc(2)'と書くことができます。 – Jack

+0

@Jackしかし、 'sizeof'を使用する通常の式に従うのではなく、それを行う特別な理由はありますか? – Daniel

+0

charがバイトであることが必須である場合、charの数をバイト数に変換することは不必要に冗長であるようです。 'foo'のコピーにスペースを割り当てるときに、' malloc((strlen(foo)+1)* sizeof(char)) 'を書くでしょうか?いずれにせよ、私はfooの型に関係なく動作する 'foo = malloc(n * sizeof * foo)'を好む。 –