FreeBASIC マニュアルのトップに戻る

FreeBASIC STRING

目次→言語リファレンス→変数とデータ型→標準のデータ型→文字型→STRING←オリジナル・サイト
目次→実行時ライブラリー参考→文字列関数STRING←オリジナル・サイト

STRING 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

標準のデータ型: 8ビットの文字列

構文:
dim variable as String [ * size]

説明:
String は、文字の並びです。

size パラメータなしで宣言された String は、文字列の長さにより、動的にサイズ変更されます。
長さの範囲は、0 バイトから 2 ギガバイトです。
記述子(descriptor)には、実際の文字列へのポインター、文字列の長さ、およびそれに割り付けられたスペースの量が含まれます。
VarPtr は、記述子へのポインターを返します。一方、StrPtr は実際の文字列を指します。

String の隠れた記述子のため、 たとえば、メモリ割り当て関数 Callocate を(優先的に)使って、文字列に手動で領域を割り当てることは推奨されません。
ループ内での不必要な割り当てを防ぐなどの目的で、String に特定の容量を確保する一般的な方法は、SpaceString 関数を使うことです。

それでも、必要に応じて、メモリ割り当て関数 Allocate, Callocate, Reallocate (使用上の注意を参照)と文字列ポインタ(文字列データではなく文字列記述子へのポインタ)を使って、動的割り当てを慎重に行うことができます。
文字列記述子(string descriptor)を保持するためにメモリを割り当てた場合、各文字列記述子の割り当てを解放する前に、常に文字列を破棄("" に設定)する必要があります(文字列データが占有していたメモリの割り当てを解放できます)。
そうしないと、後で割り当てを解放できないので、プログラム継続時にメモリリークを引き起こす可能性があります。

より簡単で安全に動的割り当て/割り当て解除を行うには、高度な New / Delete キーワード(これ自体が文字列オブジェクトのコンストラクタ/デストラクタも呼び出す)を使うことです。

記述子の使用にもかかわらず、暗黙の NULL 文字 (chr(0)) が、文字列の終端に加えられます。遅いコピーを作らずに、文字列を外部ライブラリの関数に渡すことを可能にするためです。
FreeBASIC の内部関数はこの NULL 文字を無視して、これを文字列の一部として扱いません。

固定サイズで宣言された String(数値定数、またはコンパイル時に評価可能な式)は、QB スタイルの固定長文字列です。ただし、fbc version 1.20.0 未満では未使用文字は 0 に、fbc version 1.20.0 以降ではスペースに設定されます(どの "-lang" コンパイラオプションが使用されているかにかかわらず)。これはディスクリプタを持たず、内容に合わせてリサイズされません。QB と同様に、データが文字列のサイズを超えた場合、右側が切り捨てられます。
fbc バージョン1.20.0 未満は、固定長文字列も NULL 文字で終端していたため、size + 1 バイトの空白を使いました。この NULL 終端文字は fbc version 1.20.0 以降削除され、冗長な文字がユーザ定義 Type のデータレイアウトを複雑にするのを防いでいます。
注意: fbc バージョン 1.20.0 未満では、固定長の文字列変数を含む文字列式で明示的な NULL 文字 (chr(0)) を使うことは推奨されていませんでした。これは、使用状況 (初期化、割り当て、連結、...) に応じて異なる予期しない結果が生じる可能性があるためです。

文字列変数名は、BASIC の他の方言のようなドル記号 $ で終わる必要はありません。
lang fb では、ドル記号を含む変数接尾辞は、禁止されています。

例:

'' 可変長
Dim a As String

a = "Hello"
Print a

a += ", world!"
Print a

Dim As String b = "Welcome to FreeBASIC"
Print b + "! " + a
Sleep



'' QB-like $ suffixes
#lang "qb"

'' DIM based on $ suffix
Dim a$
a$ = "Hello"

'' $ 接尾辞に基づいた暗示宣言
b$ = ", world!"

Print a$ + b$
Sleep



'' バッファとしての可変長文字列

'' 文字列のためにスペースを予約する、
'' 多くの空白文字を生成するために Space() を使う (ASCII 32)
Dim As String mybigstring = Space(1024)
Print "buffer address: &h" & Hex( StrPtr( mybigstring ), 8 ) & ", length: " & Len( mybigstring )

'' 明示的に文字列を破壊する
mybigstring = ""
Print "buffer address: &h" & Hex( StrPtr( mybigstring ), 8 ) & ", length: " & Len( mybigstring )
Sleep



'' Const パラメータとしての可変長文字列

'' Const修飾語は、文字列が修正されるのを防ぎます
Sub silly_print( ByRef printme As Const String )
    Print ".o0( " & printme & " )0o."
    '次の行は、コメントを外すとエラーを引き起こすでしょう
    'printme = "silly printed"
End Sub

Dim As String status = "OK"

silly_print( "Hello FreeBASIC!" )
silly_print( "Status: " + status )
Sleep



'Address of

'Difference between "Sadd", "StrPtr", "VarPtr", and "Address of"
'https://www.freebasic.net/forum/viewtopic.php?f=2&t=28698&p=274159#p274158
'by dodicat ≫ Jul 14, 2020 20:32
'
'@ is OK for variable length, it is @s[0]
'in fact @s[0] is universal, it works for everything including literals.
'It's a workaround because s[0] is a Ubyte, and @s[0] returns a Ubyte Ptr (not a (Z|W)String Ptr).

 
Dim As String s="abcdefghij"
Print "Dim As String s=""abcdefghij"""
Print "StrPtr(s)= ",StrPtr(s)
Print "@s= ",@s
Print "@s[0]= ",@s[0]
Print

Dim As String * 10 g="abcdefghij"
Print "Dim As String * 10 g=""abcdefghij"""
Print "StrPtr(g)= ",StrPtr(g)
Print "@g= ",@g
Print "@g[0]= ",@g[0]
Print

Dim As ZString * 10 h="abcdefghij"
Print "Dim As ZString * 10 h=""abcdefghij"""
Print "StrPtr(h)= ",StrPtr(h)
Print "@h= ",@h
Print "@h[0]= ",@h[0]
Print

Print "StrPtr(""ghijklmnopqrstuvw"")= ",StrPtr("ghijklmnopqrstuvw")
Print "@""ghijklmnopqrstuvw""= ",@"ghijklmnopqrstuvw"
Print "@(""ghijklmnopqrstuvw"")[0]= ",@("ghijklmnopqrstuvw")[0]
#Print TypeOf("ghijklmnopqrstuvw") 'ZString * 18
Print
Print "OutPut 画面に ZString * 18 と表示されているはず。何かキー入力で終了。"
Sleep

バージョン:
QBからの違い:
参照:
標準のデータ型に戻ります。
文字列関数に戻ります。
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2024-03-07 07:07:03
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall

ホームページのトップに戻る

表示-非営利-継承