1

拡張子のないファイルがあり、それに拡張子を追加したい.avi。したがって、openfileダイアログでファイルを選択した後にこの関数を呼び出します(名前を変更した後にファイルを開きたい):

int RenameVidAddExt(HWND hWnd, char oldname[MAX_PATH])
{
    int filenamesize=0, n=0;
    char extension [] = ".avi";
    char* newname;

    for (n=0 ; oldname[n]!=NULL ; n++)
    {
        filenamesize++;                                 
    }

    newname = new char[filenamesize+sizeof(extension)];

    newname = oldname;
    strcat (newname, extension);
    //SetDlgItemTextA(hWnd, IDC_EDIT1, szFile);     //test print of filenameof selected file
    //SetDlgItemTextA(hWnd, IDC_EDIT2, newname);    //test print of newname
    rename(oldname,newname);
    return 0;
}

ファイル名は変更されないだけで、理由はわかりません。テストプリントは、両方が正しい文字列oldnameを含んでいることを示しています(拡張子のない古い文字列と拡張子のある新しい文字列)。newname

4

2 に答える 2

3

C ++を使用しているので、以下も使用することを検討してstd::stringください。

int RenameVidAddExt(HWND hWnd, char oldname[MAX_PATH])
{
    char extension [] = ".avi";
    std::string newname = oldname;

    newname += extension;

    rename(oldname, newname.c_str());

    return 0;
}

いくつかのサイドノート:

  1. newまたはを使用する場合は、またはそれ以降new[]を使用する必要があることを忘れないでください(で作成されたオブジェクトまたは不要になったオブジェクト)。deletedelete[]newnew[]
  2. 文字列で遊ぶときはstd::string、できるだけ使ってみてください。これにより、メモリを手動で処理する必要がなくなり、他の変数に割り当て/コピーすることができます。
  3. を使用するのではなく、代わりnew[]に使用することをお勧めしますstd::vector。ベクトルのサイズを目的のサイズに変更します。最初の要素へのポインタが必要な場合は、を使用します&vec[0]。を使用する利点std::vectorは、メモリ管理が自動的に行われることです。
  4. 文字列の長さを手動で計算するのではなく、のような関数を使用してくださいstrlen。あるいは、aの長さは。std::stringで取得できますstr.length()
于 2011-04-07T01:00:23.857 に答える
2

ポインタ値を割り当ててCスタイルの文字列をコピーすることはできません。コードは動的に新しいバッファーを作成し、そのポインターに割り当てることですぐにそれを孤立させます。

代わりにstd::stringを使用することをお勧めします。ただし、Cスタイルの文字列を使用したい場合は、次のことを試してください。

newname = new char[filenamesize + sizeof(extension)];
strcpy(newname, oldname);   // Copies the original string character by character
strcat(newname, extension);  

幸運を!

于 2011-04-07T00:59:49.523 に答える