1

現在ファイル名を使用していますが、拡張子を除いた名前を取得する必要があります。ファイルの拡張子を決定する別の関数がありますが、拡張子なしで名前を取得する方法を見つけることができません。

mylog.txtというファイル名を持っている場合、mylogを取得できるようにしたいだけです。

私は以下を試しました

strncpy(fileNameWithoutExt, LogRotateConfiguration->logFileName,
    strlen(LogRotateConfiguration->logFileName-strlen(fileExtension)-1));

ただし、何らかの理由で、これを実行するmと、残りのファイル名の代わりに取得するだけです。ファイル名や拡張子に多くの文字が含まれていることを知ることは決してないので、どのセクションを取得する必要があるかを理解する必要があります。

つまり、基本的に、拡張子なしでファイルの名前を取得するにはどうすればよいかという質問です。

あなたが提供できるどんな助けにも感謝します。

4

3 に答える 3

1

は?

渡した ポインタから拡張機能の長さを真剣に差し引いていますstrlen()か?それは危険で奇妙に思えます。

また、strncpy()かなり風変わりなセマンティクスが本当に必要な場合を除いて、使用しないでください。そうでない可能性があります。長い文字列の一部をコピーするためにそれを使用することは、失敗するかなり良い方法です。

より良い解決策は、多くの場合、長さを把握し、以下を使用することmemcpy()です。

char         out[WHATEVER];
const size_t len = strlen(LogRotateConfiguration->logFileName);
const size_t elen = strlen(fileExtension);
const size_t out_len = len - elen;

if( out_len < sizeof out )
{
  memcpy(out, LogRotateConfiguration->logFileName, out_len);
  out[out_len] = '\0';
}
else
  out[0] = '\0'; /* Make sure we get an empty output if filename won't fit. */

これも必要に応じて使用しconst、の戻り値を strlen()適切なタイプの変数に格納することに注意してくださいsize_t

于 2012-06-15T14:05:31.040 に答える
1

コードでは、logFileName文字列ののメモリ領域のstrlenを計算しています。

lenが正しくないようです;

strncpy(fileNameWithoutExt, LogRotateConfiguration->logFileName,
   strlen(LogRotateConfiguration->logFileName)-strlen(fileExtension)-1);

                                            ^

ただし、次のコードははるかに読みやすくなります。

int logFileNameLen = strlen(LogRotateConfiguration->logFileName);
int extensionLen = strlen(fileExtension);
strncpy(fileNameWithoutExt, LogRotateConfiguration->logFileName,
   logFileNameLen -extensionLen -1);

バグを探しているときは、コードを単純化してください。

于 2012-06-15T14:06:08.847 に答える
0

これを変更する必要があります:

strlen(LogRotateConfiguration->logFileName-strlen(fileExtension)-1)

これに:

(strlen(LogRotateConfiguration->logFileName)) - (strlen(fileExtension)-1)

ここでは、logfilename-strlen(fileextension)のを取得する代わりに、strlen最初にファイル名のすべてを取得し、次にファイル拡張子のを差し引いたものを取得します。strlenstrlen

于 2012-06-15T14:06:24.377 に答える