- ベストアンサー
VB 文字判別方法の質問
- VB初心者の方が、特定のプログラムで文字を正確に取得する方法について質問しています。
- プログラムには制約があり、必ず10バイトの領域を使用しなければならないため、文字の判別が困難です。
- 文字コードは様々な可能性があるため、初期化に使える方法も限られています。良い方法を教えて欲しいとのことです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>wkStr = Space(10) を wkStr = String(10,0) に変えれば良い。 String(10,0)は「文字コードが0の文字を10文字並べた文字列」を返す。 「数字、アルファベット、記号等の文字コードは全て返される可能性がある」としても「文字コードが0の文字」は返されません。 Dim OrgStr As String Dim AnsStr As String Dim WkStr As String * 10 OrgStr = InputBox("文字列を入力") WkStr = OrgStr & String(10, 0) MsgBox (Asc(Mid(WkStr, 1, 1)) & Chr(13) & Asc(Mid(WkStr, 2, 1)) & Chr(13) & Asc(Mid(WkStr, 3, 1)) & Chr(13) & Asc(Mid(WkStr, 4, 1)) & Chr(13) & Asc(Mid(WkStr, 5, 1)) & Chr(13) & Asc(Mid(WkStr, 6, 1)) & Chr(13) & Asc(Mid(WkStr, 7, 1)) & Chr(13) & Asc(Mid(WkStr, 8, 1)) & Chr(13) & Asc(Mid(WkStr, 9, 1)) & Chr(13) & Asc(Mid(WkStr, 10, 1))) MsgBox Len(WkStr) AnsStr = Mid(WkStr, 1, InStr(1, WkStr, Chr(0), vbBinaryCompare) - 1) MsgBox "[" & AnsStr & "]" MsgBox Len(AnsStr) を実行してみましょう。 「Len(WkStr)」は、常に「10」を返します。3文字の文字列を入力しても「10」を返します。 WkStrが「ちゃんと10文字ある」のは「Asc(Mid(WkStr, 10, 1))」が成功しているので判ります。9文字以下しか無い場合はエラーになります。 「Len(AnsStr)」は、常に「10以下の入力した文字列の長さか、10」を返します。3文字の文字列を入力したら、ちゃんと「3」を返し、AnsStrは「OrgStr & String(10, 0)」により付け足した「10バイトの領域を埋める為の、余計な物」が取り除かれています。
その他の回答 (5)
- kikujack
- ベストアンサー率47% (17/36)
ANo.3です。前の回答を白紙して、質問をよくみませんから。 subStr関数を詳しく説明してください。 せめてこの関数の定義部分を説明してください。
- K-Sogacchi
- ベストアンサー率53% (50/93)
ANo.2です。 時間差でANo.1に書き込まれていたようですが… 「あくまでsubStrには10文字の空白(または何か他の文字?)を渡して、 subStrで何かをして、subStrが何か文字列を返してくるが、 その戻り値を時と場合によって加工したい」 …んですよね? >しかもスペースでも関数から返されたスペースである場合は削らずに取得したいのです。 については、元々の質問から判断すると削除したいようにしか取れないのですが、 「条件によっては」削除したいのでしょうか? >たとえば"abcdefg@@@"が返されたら とありますが、これはsubStrの戻り値の事かと思うのですが、それでいいのでしょうか? >実際の文字は"abcdefg"だと判断したい の「実際の文字」というのは、最終的なwkStrの値なのでしょうか? それとも質問には記載されていない、何か別の要素なのでしょうか? あと、この状態は、Spaceを削除した状態ですよね? それとも、単純な削除ではない、別の判定方法から、この状態にしたいのでしょうか? >本当は"abcdefg@の可能性もあるので上手く判断できません この場合は、どうなるのが正解なんでしょう? ともあれ、やりたい事や、「実際の文字」を作成する際の条件などを、 もっと明確にしてください。 これでは回答するのが難しいです。
- kikujack
- ベストアンサー率47% (17/36)
VBの変数は初期化の必要がありません。 例えば Dim wkStr As String skStr="abcdefg" もし空白で初期化の必要なら、TRIM関数を使うとスペースを削除できます。 skStr="abcdefg@@@@" '(@はスペース) wkStr=trim(wkStr)
- K-Sogacchi
- ベストアンサー率53% (50/93)
>サブには必ず10バイトの領域で渡さないといけない この「サブ」とは、subStrの事でいいんですかね? あと、 >数字、アルファベット、記号等の文字コードは全て返される可能性があるので初期化には使用できません。 とありますが、空白で初期化するのは問題ないのですか? 書かれたコードのままだと、関数に渡す文字列は固定なので、引数としての 意味は無いも同然ですが、実際には wkStr は色々な文字列が有り得るのでしょうか? ちょっと、やりたい事が見えにくい感じです。 ともあれ、まず、固定長文字列にする必要は無いと思います。 半角文字列に空白を追加して強制的に10文字にしたければ、以下のようにやればいいです。 Dim wkStr as String : (ここでwkStrの内容を ひとまず設定) : wkStr = Left(wkStr & Space(10), 10) 固定長文字列を使うとしても、subStrの戻り値が可変長のようなので、 その戻り値を固定長文字列に入れるのは、宜しくは ないかと。 別の変数を定義することが問題にならないのであれば、そうすればいいと思います。 この内容と、ANo.1で書かれている内容が、求めている回答から外れているなら、 もう少し状況が良く分かる補足をお願いします。
- andy_kun
- ベストアンサー率23% (64/274)
10桁に満たない場合は必ずスペースが入るのであれば、 wkStr = trim$(subStr(wkStr)) じゃダメなのかな?
お礼
スペースがくるとは限りません。 しかもスペースでも関数から返されたスペースである場合は削らずに取得したいのです。 あと Dim wkStr2 As String wkStr2 = subStr(wkStr) というのもダメです。説明が抜けました。すみません…
お礼
なるほど!! 完璧です。ありがとうございました。 この説明ベタな文章から読みとってくれて本当に感謝します。