電子書籍の厳選無料作品が豊富!

VB初心者です。
Dim wkStr As String * 10
wkStr = Space(10)
wkStr = subStr(wkStr)
というプログラムでwkStrに返された文字を正確に取得したいと考えています。
たとえば"abcdefg@@@"が返されたら、実際の文字は"abcdefg"だと判断したいのですが、本当は"abcdefg@の可能性もあるので上手く判断できません。(@はスペースです)
サブには必ず10バイトの領域で渡さないといけない制約があり、このサブは変更できません。
数字、アルファベット、記号等の文字コードは全て返される可能性があるので初期化には使用できません。
正確に文字を取得できれば、文字コードで初期化する方法以外でも構わないので、良い方法を教えてください。よろしくお願いします。

A 回答 (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バイトの領域を埋める為の、余計な物」が取り除かれています。
    • good
    • 0
この回答へのお礼

なるほど!!
完璧です。ありがとうございました。
この説明ベタな文章から読みとってくれて本当に感謝します。

お礼日時:2008/05/29 15:07

ANo.3です。

前の回答を白紙して、質問をよくみませんから。

subStr関数を詳しく説明してください。
せめてこの関数の定義部分を説明してください。
    • good
    • 0

ANo.2です。


時間差でANo.1に書き込まれていたようですが…
「あくまでsubStrには10文字の空白(または何か他の文字?)を渡して、
 subStrで何かをして、subStrが何か文字列を返してくるが、
 その戻り値を時と場合によって加工したい」
…んですよね?

>しかもスペースでも関数から返されたスペースである場合は削らずに取得したいのです。
については、元々の質問から判断すると削除したいようにしか取れないのですが、
「条件によっては」削除したいのでしょうか?

>たとえば"abcdefg@@@"が返されたら
とありますが、これはsubStrの戻り値の事かと思うのですが、それでいいのでしょうか?

>実際の文字は"abcdefg"だと判断したい
の「実際の文字」というのは、最終的なwkStrの値なのでしょうか?
それとも質問には記載されていない、何か別の要素なのでしょうか?
あと、この状態は、Spaceを削除した状態ですよね?
それとも、単純な削除ではない、別の判定方法から、この状態にしたいのでしょうか?

>本当は"abcdefg@の可能性もあるので上手く判断できません
この場合は、どうなるのが正解なんでしょう?

ともあれ、やりたい事や、「実際の文字」を作成する際の条件などを、
もっと明確にしてください。
これでは回答するのが難しいです。
    • good
    • 0

VBの変数は初期化の必要がありません。


例えば
Dim wkStr As String
skStr="abcdefg"

もし空白で初期化の必要なら、TRIM関数を使うとスペースを削除できます。
skStr="abcdefg@@@@" '(@はスペース)
wkStr=trim(wkStr)
    • good
    • 0

>サブには必ず10バイトの領域で渡さないといけない


この「サブ」とは、subStrの事でいいんですかね?
あと、
>数字、アルファベット、記号等の文字コードは全て返される可能性があるので初期化には使用できません。
とありますが、空白で初期化するのは問題ないのですか?
書かれたコードのままだと、関数に渡す文字列は固定なので、引数としての
意味は無いも同然ですが、実際には wkStr は色々な文字列が有り得るのでしょうか?
ちょっと、やりたい事が見えにくい感じです。

ともあれ、まず、固定長文字列にする必要は無いと思います。
半角文字列に空白を追加して強制的に10文字にしたければ、以下のようにやればいいです。
Dim wkStr as String
  :
(ここでwkStrの内容を ひとまず設定)
  :
wkStr = Left(wkStr & Space(10), 10)

固定長文字列を使うとしても、subStrの戻り値が可変長のようなので、
その戻り値を固定長文字列に入れるのは、宜しくは ないかと。
別の変数を定義することが問題にならないのであれば、そうすればいいと思います。

この内容と、ANo.1で書かれている内容が、求めている回答から外れているなら、
もう少し状況が良く分かる補足をお願いします。
    • good
    • 0

10桁に満たない場合は必ずスペースが入るのであれば、


wkStr = trim$(subStr(wkStr))
じゃダメなのかな?
    • good
    • 0
この回答へのお礼

スペースがくるとは限りません。
しかもスペースでも関数から返されたスペースである場合は削らずに取得したいのです。

あと
Dim wkStr2 As String
wkStr2 = subStr(wkStr)
というのもダメです。説明が抜けました。すみません…

お礼日時:2008/05/29 13:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!