VB2008:文字列を逆順にする関数が判らない!
- VB2008で文字列を逆順にする関数が正しく動作しない問題について質問です。
- 質問者はReverse関数を使用して文字列を逆順にする方法を試みていますが、エラーが発生しています。
- 質問者はどこで考え違いをしているのか理解できずに困っています。
- ベストアンサー
VB2008: 文字列を逆順にする関数が判らない!
Sub Main() Debug.Print(Reverse("ABC") End Sub Function Reverse(ByVal aChars As String) As String Dim C As Char Dim I As Integer Dim J As Integer Dim L As Integer = aChars.Length - 1 J = L Do While I < J C = aChars.Chars(I) aChars.Remove(I, 1) aChars.Insert(I, aChars.Chars(J)) aChars.Insert(J, C) aChars.Remove(J + 1, 1) J -= 1 I += 1 Loop Return aChars End Function 1、"ABC"の"A"を変数 C に保存。 2、"ABC"の"A"を削除。 3、"BC" の先頭に"C"を挿入。 4、"CBAC" の3番目(J=2)に変数Cを挿入。 5、"CBAC" の4番(J+1=3)を削除 6、"CBA" を戻り値にセット。 という Reverse 関数ですが動作しません。 一体、どこでどのように考え違いをしているのでしょうか? 全くわかりません。 宜しくお願いします。
- Visual Basic
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
String.Removeメソッドは結果を戻り値で返します。 ヘルプには >戻り値 >このインスタンスと等価であり、count の数の文字が削除されている新しい String。 とあります。 なので aChars = aChars.Remove(I, 1) とするとaChars="BC"になります。 Insertメソッドも同様のようです。 そうなると aChars.Insert(I, aChars.Chars(J)) でエラーが発生します。aChars="BC"なのでJ=2が通りません。 このへん再考して頂ければ修正箇所も見えてくるのではないかと思います。 逆転するだけならば、StringクラスにはCharsプロパティという 自身の文字列を1文字ずつに区切ったChar配列で返すことも できますので。この配列の要素を逆から取り出し、結合していけば 逆転した文字列をつくるのも容易かと思います。
その他の回答 (1)
- himajin100000
- ベストアンサー率54% (1660/3060)
解説書いてたのに負けたので補足。 >StringクラスにはCharsプロパティという 自身の文字列を1文字ずつに区切ったChar配列で返すことも できますので。 Charsプロパティは,デフォルトプロパティとして,indexを引数にとり,Charを返すもので,Char配列は返しません。 Char配列を取得するにはToCharArray()でもらうことになります。 反転しようと、Array.Reverseを見たのですが, 戻り値がなく、引数の配列自身を変えるので,これを格納する変数が必要になりそうで,個人的にはどうも面倒くさいなあと思いましたが,有効な手が見当たらず,お手上げかなあと思ってます
お礼
これは、単に演習です。 for(i=0,J=strlen(s)-1;i<j;i++;j--){ c=s[j]; s[i] = s[j]; s[j] =c; } で、戻り値を受けるという初歩の初歩で勘違い。 先だってた、すぐに気が付きましたが・・・。 しかし、今回はまったく・・・。 ともかく感謝です。
関連するQ&A
- VB.NETのメモリ領域について
VB.NETのメモリ領域について 以下の(1)~(12)の変数のために、 スタック領域、静的領域、ヒープ領域のどこのメモリが使われるか教えてください。 Class Sample Dim a As Integer '(1) Dim b As String = "BBB" '(2) Shared c As Integer '(3) Shared d As String = "DDD" '(4) Sub X() Dim f As Integer '(5) Dim g As String = "GGG" '(6) Static h As Integer '(7) Static i As String = "III" '(8) End Sub Shared Sub Y() Dim k As Integer '(9) Dim l As String = "LLL" '(10) Static m As Integer '(11) Static n As String = "NNN" '(12) End Sub End Class それぞれこんな認識で合ってますか? スタック領域 (1)(5)(9) スタック領域にポインタ+ヒープ領域に実体 (2)(6)(10) 静的領域 (3)(7)(11) 静的領域にポインタ+ヒープ領域に実体 (4)(8)(12)
- ベストアンサー
- Visual Basic
- VB2008: リストメンバーの列数の求め方?
Sub Main() Dim I As Integer Dim J As Integer Dim K As Integer Dim aDatas As New List(Of String())() Dim N = CSVReadToArray("D:\Temp\付属一覧.csv", aDatas) - 1 K = aDatas(0).Count - 1 For I = 0 To N For J = 0 To K Debug.Print(aDatas(I)(J)) Next J Next I End Sub 質問1、K = aDatas(0).Count - 1 の本当のやり方? 質問2、K の処理のされ方。 K が変数としてメモリに配置されることはないと推察しています。 多分、何がしかのスタック領域に一時的に置かれると・・・。 この辺りに関しても教えてもらえれば幸いです。
- ベストアンサー
- Visual Basic
- VB 2008: Do Whie...Loop文について
Function FileGetChar(ByVal f As String, ByVal p As Integer) As String Dim i As Integer = 1 Dim j As Integer = 0 Dim l As Integer Dim n As Integer = FreeFile() Dim c As Char If File.Exists(f) Then FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1) l = FileLen(f) Do While (i + j <= l) FileGet(n, c, i + j) j = j - (Math.Abs(Asc(c)) > 255) i = i + 1 If i > p Then Exit Do Else c = "" End If Loop FileClose(n) End If Return c End Function [イミディエイトウインドウ] ? FileGetChar("D:\Temp\Test.txt",1) "1" ? FileGetChar("D:\Temp\Test.txt",2) "2" と、一応は動作しています。 l------->ファイル長 i+j----->読み込みのカレントポジション p------->読み込み指示ポジション 今、悩んでいるのはDo...Loop文中のIf Else End If の追放。 何か妙手があれば教えて頂きたい。
- ベストアンサー
- Visual Basic
- vb.net Charsメソッドについて
vs2008、.NET Framework 3.5 にてvb.net の勉強をしているのですが、 下記のような場合にビルドエラーにならないことについて 疑問があります。 Public Class ClassA Private Sub methodA() Dim a As String = getString(1) ・・・★ End Sub Private Function getString() As String Return "abcdefg" End Function End ClassA getStringメソッドには引数をとらないもののみが定義 されているので、methodAからgetStringメソッドを呼び出した 場合(★)は、ビルドエラーになると思うのですが、なりません。 a の値は"b"になります。 調べてみたところ、引数に1を設定したことによって、 Charsというメソッドが呼ばれているようなのですが、 それであれば、 Dim a As String = getString().Chars(1) と書くものだと思うのですが…。 こういう書き方もできるんだという話であればそれまでなのですが、 どうも腑に落ちないので、説明できる方がいらっしゃれば 教えていただきたいです。
- ベストアンサー
- Visual Basic
- VB6.0 文字列のファイル書き込み
こんにちは。 VB6.0を研修中の新人です。 テキストファイルにランダムアクセスをし半角全角混じりの文字列を書き込むコードを考えています。 連休中は会社に入れないので自宅でコードをどのように書くかある程度決めておきたいです。 ■ あいうえお ■ カキクケコ ■ サシスセソ (サシスセソは半角です) ■ タチツテトはひ (タチツテトは半角です) メモ帳.txtに文字列を書き込むと上記のように書き込まれます。 これは見た目が悪いので下記のように"■ "がないように書き込むことは無理でしょうか。 あいうえお カキクケコ サシスセソ (サシスセソは半角です) タチツテトはひ (タチツテトは半角です) いま書いたコードは下記のとおりです。 Public Sub Main() WriteFile End Sub '書き込む関数 Public Sub WriteFile() Dim i As Integer Dim str As String Open "C:\メモ帳.txt" For Random As #1 Len = 14 Do While < 5 Select Case i Case 1 str="あいうえお" Case 2 str="カキクケコ" Case 3 str="サシスセソ" (サシスセソは半角です) Case 4 str="タチツテトはひふへほ" (タチツテトは半角です) End Select strNagasa(str,10) + vbCrlf Put #1,i,str i = i + 1 Loop Close #1 End Sub '文字列をレコードの長さに合わせる関数(いまの場合は10バイト) 'Nagasaが"10"の場合 'strが "サシスセソ" なら "サシスセソ" に半角スペースを5個詰めて返す。 'strが "タチツテトはひふへほ" なら "タチツテトはひ" の9バイトで文字列を切って半角スペースを1個詰めて返す。 Public Function StrNagasa(str As String,Nagasa As Integer) As String ... 省略(完成済み) ... End Function
- ベストアンサー
- Visual Basic
- VB6のTYPE文をVB.NETのStructureに変えるとき
VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。
- ベストアンサー
- Visual Basic
- vb.net変数に入れた文字列でメソッドを実行する
こんにちわ!! Vb.netで文字列を格納した変数を使ってメソッドを呼び出したいのですが、可能でしょうか? サンプル 'メインルーチン public sub test() Dim aaa as string ="testfunction" Dim num as integer=0 '↓の様にメソッドを呼び出したい Dim bbb = aaa(num) Msgbox(bbb ,vbinformation) aaa="testfunction2" bbb=aaa(num) Msgbox(bbb,vbinformation) Endsub 'メソッド1 Private function testfunction1(num) Return num+1 End function 'メソッド2 Private function testfunction2(num) Return num+2 End function 上記はあくまでサンプルです。 実際はメソッド数が多く、aaaにいれる名前も別で取得するので、stringになります。 ですので、bbb=aaaはforで回します。 このようなことは可能でしょうか? やりかたもしくは解決方法があればお願いします。
- ベストアンサー
- Microsoft ASP
- VBの関数の戻り値
初歩的なことですみません 受け渡し変数が1つの場合はわかりました 受け渡し変数が複数の場合どうするか、知りたいのです グローバル変数にすればできるのでしょうが 関数々々の入/出力関係がはっきりすると思いまして 例でもうしますと Function MyKansuu() as Integer ' ' MyKansuu = Kekka1 End Function これで Kekka1,Kekka2と複数ある場合です Integerのみなら、配列を使うことも考えられますが StringとIntegerがあったりすると、どうでしょう やはりこの場合、グローバル変数でしょうか
- ベストアンサー
- Visual Basic
- 【vb.net】クラス化について
大学で以下のような練習問題を頂きました。 ----- Public Sub test() Dim a As b = New c Dim i As Integer = 1 a.disp(i) End Sub 問:この時のbとcを実装せよ。 ----- Public Class c Public Function disp(ByVal i As Integer) As String return "iは" & i & "です" End Function End Class までは書いてみたのですが、b の扱いがどうもわかりません。 どなたか教えていただけませんでしょうか。
- ベストアンサー
- Visual Basic
- Cで作成したDLL関数をVBから呼ぶ(.NET)
以前の質問に「Cで作成したDLL関数をVBから呼ぶ」(QNo.1703839)がありますが、下記のコードを見るとVB6での内容だと思います。 Dim keydata As String * 128 keydata = String$(128, Chr(0) & Chr(0)) VB.NETでVC++のDLLで変更した文字列を受けたいのですが、 どのようにすればよいのでしょうか? VB.NET2003 <DllImport("DllTest.dll")> Private Shared Function _ Test(ByVal s1 As String) As String End Function Private Sub btnTest_Click(...) ... Dim s1 As String = "abc" Dim s2 As String Dim s3 As String s2 = Test(s1) MessageBox.Show(s2) ' "1"が表示される s3 = StrConv(s2, VbStrConv.None) MessageBox.Show(s3) ' 同じく"1"が表示 end sub VC++のDLL extern "C" __declspec (dllexport) BSTR __stdcall Test(char* s1) { AfxMessageBox(s1); // "abc"が表示される OK strcpy(s1, "123"); CString s2; s2 = "123"; return s2.AllocSysString(); } また、文字列に全角を含めても大丈夫でしょうか? Unicodeの変換処理を行う必要があるのでしょうか? よろしくお願いします。
- 締切済み
- Visual Basic
お礼
面目ありません。 すっかり、<String.Removeメソッドは結果を戻り値で返す>を失念。 つい先だって、それを確認していましたが・・・。 で、無事に動作しました。 まことに、面目ない次第です。 感謝です。