メモリー・ブロックに使用されるワードは文字列(string)にも役立つため、 文字列(string)の移動やコピーや比較や検索を行うワードについては、 Memory Blocks を参照してください。 文字や文字列を表示するワードについては、 see Displaying characters and strings を参照してください。
以下のワード群は、 既に存在している文字列(strings)に対して機能します:
str=
( c-addr1 u1 c-addr2 u2 – f ) gforth-0.6 “str-equals”
str<
( c-addr1 u1 c-addr2 u2 – f ) gforth-0.6 “str-less-than”
string-prefix?
( c-addr1 u1 c-addr2 u2 – f ) gforth-0.6 “string-prefix-question”
c-addr2 u2 が c-addr1 u1 の接頭辞部分と合致しますか?
string-suffix?
( c-addr1 u1 c-addr2 u2 – f ) gforth-1.0 “string-suffix-question”
c-addr2 u2 が c-addr1 u1 の接尾辞部分と合致しますか?
search
( c-addr1 u1 c-addr2 u2 – c-addr3 u3 flag ) string “search”
文字列 c-addr1, u1 の中で、 文字列 c-addr2, u2 を検索します。 flag が true の場合: 見つかったアドレスを c-addr3 に、 文字列 c-addr2, u2 を含むそれ以降の文字数を u3 に返します(訳注: s" GNU gforth マニュアル" s" ニュア" search drop ." [" type ." ]" [ニュアル] ok )。 flag が false の場合: 一致するものが見つかりませんでした。 c-addr3, u3 は c-addr1, u1 と同じです。
scan
( c-addr1 u1 c – c-addr2 u2 ) gforth-0.2 “scan”
c に等しくないすべての文字をスキップします。 結果は c で始まる(c-addr2 u2)か空(empty; c-addr2+u2, 0)です。
Scan
はシングルバイト文字(ASCII)に限定されます。 マルチバイト文字を検索するには、 search
を使用します。
scan-back
( c-addr u1 c – c-addr u2 ) gforth-0.7 “scan-back”
skip
( c-addr1 u1 c – c-addr2 u2 ) gforth-0.2 “skip”
c に等しいすべての文字をスキップします。 結果は最初の非 C 文字で始まる(アドレス、長さ)か、 空(文字列の長さ0)になります。
skip
はシングルバイト文字(ASCII)に限定されます。
-trailing
( c_addr u1 – c_addr u2 ) string “dash-trailing”
c-addr, u1 で指定された文字列の末尾をトリムします(末尾のスペースをすべて削除します)。 u2 は変更後の文字列の長さです。
/string
( c-addr1 u1 n – c-addr2 u2 ) string “slash-string”
c-addr1, u1 で指定された文字列の先頭から n 文字削除します(訳注: c-addr1+n, u1-n するだけっぽい…)。
safe/string
( c-addr1 u1 n – c-addr2 u2 ) gforth-1.0 “safe-slash-string”
c-addr1, u1 で指定された文字列の先頭から n 文字を削除します。 /string
とは異なり、safe/string
は少なくとも 0 文字、 最大で u1 文字を削除します。
cstring>sstring
( c-addr – c-addr u ) gforth-0.2 “cstring-to-sstring”
C-addr はゼロで終わる文字列の開始アドレス、 u はその長さです。
以下のワード群は、 ASCII 文字については大文字と小文字を区別せずに比較しますが、 (ワードリストの検索のような)非 ASCII 文字については大文字と小文字を区別します 。
capscompare
( c-addr1 u1 c-addr2 u2 – n ) gforth-0.7 “capscompare”
文字列内のバイトの値に基づいて、 2 つの文字列(string)を辞書順(lexicographically)に比較します。ただし、 ASCII 文字は大文字と小文字を区別せずに比較し、 非 ASCII 文字は大文字と小文字を区別して、 かつ、 ロケール固有の照合順序を使用せずに比較します。 それらが等しい場合 n は 0 です。 最初の文字列が小さい場合 n は -1 です。 最初の文字列が大きい場合n は 1 です。
capsstring-prefix?
( c-addr1 u1 c-addr2 u2 – f ) gforth-1.0 “capsstring-prefix?”
string-prefix?
と似ていますが、 ASCII 文字の大文字と小文字は区別されません: c-addr2 u2 は
c-addr1 u1 の接頭辞か?
capssearch
( c-addr1 u1 c-addr2 u2 – c-addr3 u3 flag ) gforth-1.0 “capssearch”
search
と似ていますが、 ASCII 文字の大文字と小文字は区別されません: c-addr1 u1 内で
c-addr2 u2 を検索します。 見つかった場合 flag は true になります。
以下のワード群は、 ヒープに文字列(string)を作成、 またはヒープの文字列(string)を拡張します。
s+
( c-addr1 u1 c-addr2 u2 – c-addr u ) gforth-0.7 “s-plus”
c-addr u は、c-addr1 u1 (最初) と c-addr2 u2 (2 番目) を連結したのを含む、 新しく
allocate
された文字列です。
append
( c-addr1 u1 c-addr2 u2 – c-addr u ) gforth-0.7 “append”
C-addr u は、c-addr1 u1 (最初) と c-addr2 u2 (2 番目) を連結したものです。
c-addr1 u1 は allocate
された文字列であり、 u
文字の領域に対応するために(可能なら)サイズ変更(resize)して c-addr2 u2
の文字列を追加(append)します(サイズ変更できなくて、新しいアドレスに移動する可能性があります)。
>string-execute
( ... xt – ... addr u ) gforth-1.0 “>string-execute”
xt を実行(execute)すると、 標準出力 (type
や emit
やそれらを使用するすべてのもの)
を文字列にリダイレクトします。 結果の文字列は addr u で、これは割り当てられた(allocate
)メモリー内にあります。
この文字列を開放(free
)するのは、 >string-execute
の呼び出し元の責任です。
以下のようにして、>string-execute
を使用して s+
を定義できます:
: s+ ( c-addr1 u1 c-addr2 u2 – c-addr u ) [: 2swap type type ;] >string-execute ;
2 つの文字列だけを連結する場合、 >string-execute
は効率的ではありませんが、 多くの文字列を連結する場合は、
>string-execute
の方が効率的です。