• ベストアンサー

どこがまずいですか?

VBで使う為、"\"が何個あるか調べるDLLをつくってみました。 上手くいかないのですが、While文が意味を成してないような感じです。ご指導お願いします。 #include <string.h> int _stdcall CLength(const char* FullStr, const char* SubStr) { int j, c, L; c = 1; j = 1; char* chstr; char* copystr; L = strlen(SubStr); chstr = strstr(FullStr, SubStr); while(chstr == SubStr) { copystr = chstr; chstr = strstr(copystr, SubStr); c = c + 1; } return c; };

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは while分の比較ですが chstrはFullStrのSubStrが見つかったポインタで SubStrとはまったく別の領域を指し示したいますので 比較するのは間違っているかと思います。 それとcopystrにchstrを代入している部分ですが これだと同じところを検索してしまうので+1しないといけないと思います。 以下のよう修正されればいかがでしょうか? 修正前 while(chstr == SubStr) { copystr = chstr; chstr = strstr(copystr, SubStr); c = c + 1; } 修正後 c=0; while(chstr) { c++; copystr = chstr+1; chstr = strstr(copystr, SubStr); } strstr()は見つからなかった場合NULLポインタを返しますのでこれでよいかと思います。 おかしければまた質問ください

aki44
質問者

補足

ありがとうございます。早速書き換えてみましたが、うまくいきません。cがそのまま0を返してしまいます。もしかしてVBのコードが間違っているのでしょうか? 標準モジュールに Option Explicit Declare Function CLength Lib "DLL.dll" _ (ByRef a As String, ByRef b As String) As Integer コマンドボックスとテキストボックスを作って、 Private Sub Command1_Click() Text1.Text = CLength("c:\abc\def\ghi\jk.txt", "\") End Sub 何度もすみませんm(_*_)m

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>Declare Function CLength Lib "DLL.dll" _ (ByRef a As String, ByRef b As String) As Integer 文字列を渡すときはByValに、また32bitOSのint型は32bitなので、Longに対応します。 なので、 Declare Function CLength Lib "DLL.dll" _ (ByVal a As String, ByVal b As String) As Long あと、strstrでは、"\"を検索するときに、パス名にSJISで"表"のように2バイト目に0x5cが来るような文字があると誤動作します。 _mbsstrを使いましょう。

aki44
質問者

お礼

知識不足を痛感しました。とりあえず上手くいきました。 今から_mbsstrを使うように変更したいと思います。 ありがとうございました。

  • clsdi99
  • ベストアンサー率63% (31/49)
回答No.2

ちょっと気になったので発言いたします。 質問者様は、UNICODE(ワイド文字)やマルチバイト文字について意識されていますか? VBでは内部的にUNICODEで文字列を表現していますので その辺を意識しないと問題があるのではなでしょうか?

aki44
質問者

お礼

あ、確かにそうですね、ご指摘ありがとうございます。

関連するQ&A