文字列の中身を一部分のみ削除するには?

解決


ななし  2008-07-10 04:29:01  No: 68672

ファイルのパスを取得し、そこからファイル名だけを取得
したいと考えてます。

ファイルのパスを取得するところまではできたのですが、
そこからファイル名だけを取得するところでつまずいています。

char edit_str = "C:\usr\local\main.cpp";
このようにパスが格納されているとして、
edit_str = "main.cpp";
にしたいのですが、
どのようにすればいいでしょうか?

Cの標準関数を利用すると
char *ans;
ans = strstr( edit_str, "\\");   //"\\"が含まれているかどうかを検索
while( ans ){   // "\\"が含まれている間
    // ファイル名のみを取得する操作
}
このwhile文のなかで、
別の文字列に"\\"が含まれない部分をコピーする
といったことができたらとおもったのですが、
文字列を削除するといった関数がないため、
使える関数がわかりませんでした。

よろしくお願い致します。


επιστημη  URL  2008-07-10 06:47:07  No: 68673

↓こんなんでえぇですか?

#include <iostream>
#include <cstring>

int main() {
  char result[32];
  char* edit_str = "C:\\usr\\local\\main.cpp";
  strcpy(result,strrchr(edit_str,'\\')+1);
  std::cout << '[' << result << ']' << std::endl;
}


ん?  2008-07-10 07:56:00  No: 68674

>ファイルのパスを取得し、そこからファイル名だけを取得
>したいと考えてます。

_splitpath() / _makepath() を調べててみてください。


Blue  2008-07-10 10:27:00  No: 68675

(環境が明記されていないので勝手にWindowsとする)
strstrやstrchrはWindows系のchar型配列で扱う文字列で使用する場合
文字コードがCP932(Shift_JIS)なので、「\」を検索するときに問題があります。
http://ja.wikipedia.org/wiki/Shift_JIS#2.E3.83.90.E3.82.A4.E3.83.88.E7.9B.AE.E3.81.8C5C16.E7.AD.89.E3.81.AB.E6.88.90.E3.82.8A.E3.81.86.E3.82.8B.E3.81.93.E3.81.A8.E3.81.AB.E3.82.88.E3.82.8B.E5.95.8F.E9.A1.8C
の「2バイト目が5C等に成りうることによる問題」を参考。

_mbsstr、_mbschr等のマルチバイト対応関数を使うか、
ん?さんからも指摘がある、パス分割関数_splitpathを使うか、
パス専用APIのPathFindFileNameAあたりを使うか、
そもそもUnicodeで処理するかどれかにしたほうが良いでしょう。


かもねぎ  2008-07-10 18:43:57  No: 68676

/*    
    PathFindFileName.cpp

    Windows XP Pro sp3 , VC2005
    マルチバイト、ユニコード、設定なし、どれでも良いみたい
*/

#include    <windows.h>
#include    <shlwapi.h> // link : shlwapi.lib

int main ( )
{
    TCHAR   Path [ ] = TEXT ( "C:\\user\\local\\main.cpp" ) ;
    LPTSTR  FileName = PathFindFileName ( Path ) ;
   
    DWORD   Written ;
    LPCTSTR NewLine = TEXT ( "\r\n" ) ;
    HANDLE  hOutput = GetStdHandle ( STD_OUTPUT_HANDLE ) ;

    WriteConsole ( hOutput, FileName, lstrlen ( FileName ), &Written, NULL ) ;
    WriteConsole ( hOutput, NewLine,  lstrlen ( NewLine ),  &Written, NULL ) ;
    system ( "pause" ) ;

    return 0 ;
}


ななし  2008-07-11 07:39:09  No: 68677

環境を言うのを忘れてしまいすいません。
WindowsXP、VCで作成しておりました。
>επιστημηさん
ありがとうございます。
その方法で上手く抜き出すことができました。

>ん?さん、Blueさん,かもねぎさん
ご指摘にあるとおり、標準関数ですと\の検索のとき
に文字コードで引っかかるようですね。
PathFindFileName();関数で取得をするように変更しました。
(かもねぎさんの例を参考にさせていただきました)

解決となりました。みなさんありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加