2011-10-24 19 views
0

コマンドラインからファイルパス名を取得してファイルを開くプログラムを作成しています。私の質問です:文字列を作成することは可能です、ユーザーが入力を与える瞬間、それはちょうどそれに収まるようにファイルパスに必要なサイズでしょうか?そうでない場合は、私が使用しなければならない非動的文字配列の理想的なサイズは何ですか?動的に生成された文字列に、コマンドラインで指定されたファイル名を保存します。

私はハードコードされた文字列のサイズを取り除きたい:

char filename[100]; 
scanf(" %s", filename); 

それはとても多くの問題が付属しています。

+0

あなたは今やっていることや試したことのコード例を挙げることができますか? – Danpe

+1

コマンドラインで指定された完全パスか、後でユーザー入力で変更する必要がありますか?それは私には分かりません。また、 'stdlib.h'をインクルードするかどうかを定義するPATH_MAX(あるいは古いシステムではおそらくMAX_PATH)が必要です。 –

+0

まあ、私は引数としてコマンドラインからそれを与え、scanfでそれを与えると違いがあると思います。私は両方を実装する予定だった。 –

答えて

1

FILENAME_MAXマクロ(stdio.hで定義)は、ファイル名の最大長または推奨長(引用符:222) If the implementation imposes no practical limit on the length of file name strings, the value of FILENAME_MAX should instead be the recommended size of an array intended to hold a file name string.)を指定します。私は、あなたのターゲットOSのファイル名の長さの制限を調べると言うでしょう。

1

%asフォーマット指定子を使用してscanfを参照してください。これは、バッファに指定するためにどのようなサイズ心配についてあなたを緩和する、あなたのためのバッファを割り当てる必要があります。

char *buf; 
scanf("%as", &buf); 

Linux manualから:

オプション「」の文字が。これは文字列変換で使用され、 は呼び出し元に の対応するバッファを割り当てる必要性を呼び起こします。代わりにscanf()は十分な のバッファを割り当て、対応する にこのバッファのアドレスを割り当てますポインタ引数は、char *変数へのポインタでなければなりません(この 変数は呼び出しの前に初期化する必要はありません)。呼び出し元 は、もはや必要でなくなったときに、このバッファを(3)解放します。 これはGNU拡張です。 C99では変換文字として 'a'文字を使用しています(GNUの実装でも同様に使用できます)。

+0

これはansi cでは使用できませんか? –