2012-01-08 11 views
-1

nullの終了/ゼロ終了などの文字配列の長さを調べるにはどうすればよいですか?(C/C++)文字の配列のサイズ

私はwriteFile関数を書いたので、私はその 'len'パラメータを取り除きたいと思っています。

int writeFile(FILE * handle, char * data, int len) 
{ 
    fseek(handle, 0, SEEK_SET); 
    for(int i=0; i <= len; i++) 
     fputc(data[i], handle); 
} 
+4

'struct'などで2つを組み合わせたり、' std :: string'や 'vector'などを使っていない限り、' len'はそこにあります。あなたの質問はC++にタグ付けされています。 –

+4

C++の場合、http://stackoverflow.com/a/2404697/103167を参照してください。ところで、実際には 'len + 1'文字を書いています。 –

答えて

3

lenパラメータを削除することはできません。コンピュータはあなたの意図を推測するためのオラクルではありません。しかし、fputc()よりもはるかに効率的にデータを書き込むfwrite()関数を使用することができます。

0
#define writeFile(handle, data) writeFileImpl(handle, data, sizeof data) 
+3

ポインタに崩壊した配列が渡された場合、または 'malloc'のテキスト文字列があればどうなりますか? :)この場合、マクロはあまりにも悪いと思うのですが、遅かれ早かれ、誰かがそれがすべてで動作すると仮定します... – Necrolis

+0

@Necrolis:私のコメントでリンクしているC++の解決策は、ポインタのサイズを報告することとは対照的です。しかし、あなたがCで動作するものを持っていなければならない、これはそれです。 –

1

ヌルターミネータのようなセンチネル値が使用される理由*、つまり何ポータブル方法はありません。

実際には、データバッファから部分的な書き込みを可能にするため、長さパラメータを指定する方が優れています(ただし、あなたの場合は長さとしてsize_t/std::size_tを使用します)。

* Windowsでは_msizeを試してみることもできますが、涙が出ます。

+1

涙...頭の中で自分を撃つ... 10階の窓から飛び降りる... –

0

Seith Carnegieがコメントしたように、あなたはそれを行うことはできません(の長さをのcharの配列にすること)。

一部のCライブラリでは、ヒープ割り当てメモリのメモリ(例:mallocで得られたポインタ)の(オーバーサイズの)見積もりを与える拡張が提供されています。

Boehm's garbage collector(これは非常に便利です!)を使用している場合、のGC_size機能を提供します。

しかし、charの配列が構造体内または呼び出しスタック上にある場合、実行時にそのサイズを取得する方法はありません。あなたのプログラムだけがそれを知っています。

0

データの長さを決定する別の方法がない限り(通常はヌルターミネータを使用して)、lenパラメータを取り除くことはできません。これは、CおよびC++ではデータの長さが格納されないためです。さらに、プログラマはlenパラメータを理解するでしょう。配列内のすべてのバイトを常に書き出す必要はありません。