Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

sscanf

書式付きデータの文字列からの読み込み

説明

A = sscanf(str,formatSpec)str からデータを読み取り、formatSpec で指定した書式に従って変換し、その結果を配列で返します。str は文字配列または string スカラーです。関数 sscanfformatSpecstr の一連の文字に繰り返し適用します。この処理は、str の最後に達するか、formatSpec が一連の文字と一致しなかった場合に終了します。str が複数行がある文字配列である場合、関数 sscanf は列順に文字を読み取ります。

A = sscanf(str,formatSpec,sizeA) は、出力配列のサイズを sizeA に設定し、データを str から出力配列に読み取ります。sizeA は正の整数であるか、[m n] の形式でなければなりません (mn は正の整数)。

また、[A,n] = sscanf(___) は、sscanfA に正常に読み取った要素の数を返します。

[A,n,errmsg] = sscanf(___) はまた、sscanf がすべてのデータを A に読み取れなかった場合に、エラー メッセージを含む文字ベクトルを返します。sscanf が成功すると、errmsg は空の文字ベクトルとなります。

[A,n,errmsg,nextindex] = sscanf(___) はまた、sscanf がスキャンした最後の文字の直後にある、str の位置のインデックスを返します。

すべて折りたたむ

複数の数値を空白文字で区切って表す文字ベクトルを作成します。この文字ベクトルを数値の列ベクトルに変換します。sscanf は空白文字を数値間の区切り文字として扱います。

chr = '2.7183  3.1416  0.0073'
chr = 
'2.7183  3.1416  0.0073'
A = sscanf(chr,'%f')
A = 3×1

    2.7183
    3.1416
    0.0073

複数の数値を表す string を作成し、sscanf を使用して変換します。出力配列のサイズを指定します。

R2017a 以降、二重引用符を使用して string を作成できるようになりました。

str = "2.7183  3.1416  0.0073"
str = 
"2.7183  3.1416  0.0073"
A = sscanf(str,'%f',[1 3])
A = 1×3

    2.7183    3.1416    0.0073

str を 2 行 2 列の行列に変換します。str は 3 つの数値しか表さないため、sscanfA を 0 でパディングし、行列を埋めます。

A = sscanf(str,'%f',[2 2])
A = 2×2

    2.7183    0.0073
    3.1416         0

空白文字で区切られた数値を含む string を作成します。sscanf がこの string を数値に変換する際に出力配列に挿入した要素をカウントします。

R2017a 以降、二重引用符を使用して string を作成できるようになりました。

str = "78 72 64 66 49"
str = 
"78 72 64 66 49"

出力配列 A の要素をカウントします。%d 演算子を使用してこの string の数値を変換します。%d は空白文字で区切られた整数と一致します。A の要素数を返すには、2 番目の出力引数を指定します。

[A,n] = sscanf(str,'%d')
A = 5×1

    78
    72
    64
    66
    49

n = 5

string を作成し、そこからデータを読み取ります。sscanf が入力 string 全体を変換できなかった場合、エラー メッセージを表示します。

R2017a 以降、二重引用符を使用して string を作成できるようになりました。

str = "3.14159 are the first 6 digits of pi"
str = 
"3.14159 are the first 6 digits of pi"

str の数値を変換します。str には %f と一致しない文字も含まれているため、sscanf はエラー メッセージを返します。sscanf'are' という単語を検出すると、この単語を数値に変換できないため、処理を停止します。

[A,n,errmsg] = sscanf(str,'%f')
A = 3.1416
n = 1
errmsg = 
'Matching failure in format.'

文字ベクトルを作成し、そこからデータを読み取ります。sscanf が入力全体を変換できなかった場合、sscanf が停止した位置の直後のインデックスを返します。このインデックスを使用して、スキャンされなかった入力を表示します。

chr = '3.14159 are the first 6 digits of pi'
chr = 
'3.14159 are the first 6 digits of pi'

chr 内のデータを変換します。インデックスを返します。

[A,~,~,nextindex] = sscanf(chr,'%f')
A = 3.1416
nextindex = 9

chr の文字のうち sscanf がスキャンしなかったものを表示します。

chr(nextindex:end)
ans = 
'are the first 6 digits of pi'

複数の温度を含む string を作成します。温度は度記号と文字 F で表します。この温度を数値配列に変換します。

R2017a 以降、二重引用符を使用して string を作成できるようになりました。度記号 (char(176)) を挿入するには、関数 insertBefore を使用します。

T = "78F 72F 64F 66F 49F";
degreeSymbol = char(176);
T = insertBefore(T,'F',degreeSymbol)
T = 
"78°F 72°F 64°F 66°F 49°F"

温度を数値配列として返します。

A = sscanf(T,strcat("%d",degreeSymbol,"F"))
A = 5×1

    78
    72
    64
    66
    49

入力引数

すべて折りたたむ

スキャンする入力テキスト。文字配列または string スカラーとして指定します。str が文字配列の場合、行が複数存在することがあり、sscanf は列順に文字を読み取ります。

データ型: char | string

入力フィールドの書式。書式演算子として指定します。formatSpec は一重引用符で囲まれた文字ベクトル、または string スカラーにすることができます。

数値フィールド

次の表は、テキストを数値出力に変換するために使用可能な変換指定子の一覧です。sscanf は値を 10 進数表現 (基数 10) に変換します。

数値フィールド タイプ

変換指定子

説明

整数、符号付き

%d

基数 10。

%i

この値により基数が決定されます。

  • 既定の設定は基数 10 です。

  • 最初の数字が 0x または 0X の場合、値は基数 16 (16 進数) になります。

  • 最初の数字が 0 の場合、値は基数 8 (8 進数) になります。

%ld または %li

64 ビットの値、基数 10、8、16。

整数、符号なし

%u

基数 10。

%o

基数 8 (8 進数)。

%x

基数 16 (16 進数)。

%lu, %lo, %lx

64 ビットの値、基数 10、8、16。

浮動小数点数

%f%e または %g

浮動小数点値。入力フィールドには、次のどれでも含めることができます (大文字と小文字の区別なし)。Inf-InfNaN-NaN。浮動小数点数を表す入力フィールドでは、先頭の + または - 記号、e または E を使用した指数表現を使用できます。変換指定子 %f%e および %g はいずれも入力フィールドを同様に処理します。

文字フィールド

次の表は、テキストを変換して出力を文字配列にするために使用可能な変換指定子の一覧です。

文字フィールド タイプ

変換指定子

説明

文字ベクトルまたは string スカラー

%s

sscanf が空白を検出するまで、テキストを読み取ります。

%c

空白も含め、任意の 1 文字を読み取ります。
一度に複数の文字を読み取るには、フィールド幅を指定します。たとえば、%10c は一度に 10 文字を読み取ります。

パターンマッチング

%[...]

大かっこ内の文字のみを、不一致文字または空白に達するまで読み込みます。

例: %[mus]'summer ''summ' として読み取ります。

formatSpec に数値と文字の指定子の組み合わせが含まれる場合、sscanf は各文字をそれに相当する数値に変換します。

オプションの演算子

  • 無視するフィールドと文字

    sscanf は、特定のフィールドまたはフィールドの一部を無視するように指示していない限り、すべての数値および文字を順番に読み取ります。フィールドをスキップするには、パーセント記号 (%) の後にアスタリスク (*) を挿入します。たとえば、整数をスキップするには、%*d を指定します。

  • フィールド幅

    一度に読み取る桁またはテキスト文字の最大数を指定するには、パーセント文字の後に数値を挿入します。たとえば、%10c は一度に最大 10 文字 (空白を含む) を読み取ります。%4f は、一度に最大 4 桁 (小数点を含む) を読み取ります。

  • 無視するリテラル テキスト

    sscanf は変換指定子の直前または直後にある指定テキストを無視します。

    例: Level%u'Level1'1 として読み取ります。

    例: %uStep'2Step'2 として読み取ります。

データ型: char | string

出力配列 A の次元。Inf、正の整数または 2 要素の行ベクトルとして指定します。

入力 sizeA の形式

説明

Inf

入力を最後まで読み取ります。
数値データの場合、A は列ベクトルになります。
テキスト データの場合、A は文字ベクトルになります。

n

最大 n 個の数値またはスペース区切りの文字フィールドを読み取ります。
数値データの場合、A は列ベクトルになります。
テキスト データの場合、A は文字ベクトルになります。

[m n]

最大 m*n 個の数値または文字フィールドを読み取ります。n には Inf を指定できますが、m には指定できません。Amn 列で、列順に埋められます。

データ型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

出力引数

すべて折りたたむ

出力データ。列ベクトル、行列または文字配列として返されます。A のクラスとサイズは、formatSpec で指定した変換と、sizeA で指定した出力配列のサイズにより異なります。

  • formatSpec に数値指定子のみが含まれる場合、A は数値列ベクトルになります。sizeA 引数も指定すると、A は指定したサイズの行列になり、必要であれば 0 でパディングされます。入力の値の数が sizeA より少ない場合、A のサイズは sizeA より小さくなります。代わりに、これは入力からスキャンした値を格納するために必要なサイズとなります。

    • formatSpec に 64 ビットの符号付き整数指定子のみが含まれる場合、A のクラスは int64 になります。

    • formatSpec に 64 ビットの符号なしの整数指定子のみが含まれる場合、A のクラスは uint64 になります。

    • それ以外の場合、A はクラス double です。

  • formatSpec%c または %s 指定子のみが含まれている場合、A は文字ベクトルになります。sizeA も指定すると、A は文字配列になり、必要であれば null 文字でパディングされます (null 文字は値が 0 の制御文字です)。入力の文字数が sizeA より少ない場合、A のサイズは sizeA より小さくなります。代わりに、これは入力からスキャンした文字を格納するために必要なサイズとなります。

  • formatSpec に数値と文字の指定子の組み合わせが含まれる場合、A はクラス double の数値になり、sscanf は各文字をそれに相当する数値に変換します。この変換は、formatSpec がすべての数値フィールドを明示的にスキップする場合 (たとえば、formatSpec'%*d %s' の場合) でも発生します。

  • sscanf がすべての入力を formatSpec と一致させられなかった場合、A は数値または文字配列になります。A のクラスは、処理が終了する前に sscanf が読み取る値によって異なります。

データ型: double | int64 | uint64 | char

出力配列に読み取られた要素の数。整数として返されます。

データ型: double

エラー メッセージ。文字ベクトルとして返されます。strsscanf が変換できないデータが含まれている場合、errmsg にはエラー メッセージが含まれます。sscanf がすべてのデータを正常に変換した場合、errmsg は空の文字ベクトルになります。

データ型: char

スキャンした最後の文字の後の位置。整数として返されます。

データ型: double

ヒント

  • 関数 sscanf および fscanf の読み取りに対する書式指定子は、関数 sprintf および fprintf の書き込み用の形式とは異なります。読み取り関数は精度フィールドをサポートしません。幅フィールドは、書き込み用には最小値を、読み取り用には最大値を指定します。

R2006a より前に導入