本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

sscanf

从字符串读取格式化数据

说明

示例

A = sscanf(str,formatSpec)str 读取数据,根据 formatSpec 指定的格式对其进行转换,并将结果返回到数组中。str 是字符数组或字符串标量。sscanf 函数重复将 formatSpec 应用于 str 中的字符序列,直到它到达 str 的末尾或无法将 formatSpec 与一个字符序列匹配。如果 str 是一个包含多行的字符数组,sscanf 以列顺序读取字符。

示例

A = sscanf(str,formatSpec,sizeA) 将输出数组的大小设置为 sizeA,然后将数据从 str 读入输出数组。sizeA 必须是正整数或具有 [m n] 形式,其中 mn 是正整数。

示例

[A,n] = sscanf(___) 还返回 sscanf 成功读入 A 的元素数。

示例

[A,n,errmsg] = sscanf(___) 还会在 sscanf 无法将所有数据读入 A 时返回包含错误消息的字符向量。如果 sscanf 成功,则 errmsg 是一个空字符向量。

示例

[A,n,errmsg,nextindex] = sscanf(___) 还返回 str 中紧跟在由 sscanf 扫描的最后一个字符之后的位置的索引。

示例

全部折叠

创建一个表示由空白字符分隔的多个数值的字符向量。将字符向量转换为数值的列向量。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

创建表示多个数值的字符串,并使用 sscanf 转换它。指定输出数组的大小。

从 R2017a 开始,您可以使用双引号创建字符串。

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 仅代表三个数值,因此 sscanf 会用足够多的零填充 A 以填满矩阵。

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

    2.7183    0.0073
    3.1416         0

创建一个字符串,其中包含由空白字符分隔的数值。统计 sscanf 在将字符串转换为数值时放入输出数组的元素数目。

从 R2017a 开始,您可以使用双引号创建字符串。

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

统计输出数组 A 中的元素数目。使用 %d 运算符转换字符串中的数值。%d 将匹配用空白分隔的整数。要返回 A 中的元素数,请指定第二个输出参数。

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

    78
    72
    64
    66
    49

n = 5

创建一个字符串,并从中读取数据。如果 sscanf 不能转换所有输入字符串,将显示错误消息。

从 R2017a 开始,您可以使用双引号创建字符串。

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

显示 chrsscanf 未扫描的字符。

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

创建包含多个温度的字符串,这些温度由度符号和字母 F 指示。将温度转换为数值数组。

从 R2017a 开始,您可以使用双引号创建字符串。要插入度符号 (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

输入参数

全部折叠

要扫描的输入文本,指定为字符数组或字符串标量。如果 str 是一个字符数组,则它可以具有多行,并且 sscanf 以列顺序读取字符。

数据类型: char | string

输入字段的格式,使用格式化操作符指定。formatSpec 可以是用单引号引起来的字符向量,或字符串标量。

数值字段

下表列出了可用于将文本转换为数值输出的转换设定符。sscanf 将值转换为其十进制(以 10 为基数)的表示形式。

数值字段类型

转换设定符

说明

有符号整数

%d

以 10 为基数。

%i

值确定相应基数:

  • 默认值以 10 为基数。

  • 如果初始数字为 0x0X,则值以 16 为基数(十六进制)。

  • 如果初始数字为 0,则值以 8 为基数(八进制)。

%ld%li

64 位值,以 10、8 或 16 为基数。

无符号整数

%u

以 10 为基数。

%o

以 8 为基数(八进制)。

%x

以 16 为基数(十六进制)。

%lu, %lo, %lx

64 位值,以 10、8 或 16 为基数。

浮点数

%f%e%g

浮点值。输入字段可以包含下列任意项(不区分大小写):Inf-InfNaN-NaN。表示浮点数的输入字段可以包括前导 +- 符号以及使用 eE 的指数记数法。转换设定符 %f%e%g 全都以相同的方式处理输入字段。

字符字段

下表列出了可用于转换文本的转换设定符,以便输出是一个字符数组。

字符字段类型

转换设定符

说明

字符向量或字符串标量

%s

读取文本,直至 sscanf 遇到空白。

%c

读取任何单个字符,包括空白。
要一次读取多个字符,请指定字段宽度。例如,%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、正整数或一个二元素行向量。

sizeA 输入的格式

说明

Inf

将输入读取到末尾。
对于数值数据,A 是一个列向量。
对于文本数据,A 是一个字符向量。

n

最多读取 n 个数值或空格分隔的字符字段。
对于数值数据,A 是一个列向量。
对于文本数据,A 是一个字符向量。

[m n]

最多读取 m*n 个数值或字符字段。n 可以为 Inf,但 m 不可以。A 是按列顺序填充的 m×n 数组。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

输出参数

全部折叠

输出数据,以列向量、矩阵或字符数组形式返回。A 的类和大小取决于 formatSpec 指定的转换以及 sizeA 指定的输出数组的大小:

  • 如果 formatSpec 仅包含数值设定符,则 A 为数值列向量。如果您还指定了 sizeA 参数,则 A 是指定大小的矩阵,并且必要时会使用零填充。如果输入包含的值数少于 sizeA 个,则 A 将小于 sizeA。它是存储从输入扫描的值所需的大小。

    • 如果 formatSpec 仅包含 64 位有符号整数设定符,则 Aint64 类。

    • 如果 formatSpec 仅包含 64 位无符号整数设定符,则 Auint64 类。

    • 否则,Adouble 类。

  • 如果 formatSpec 仅包含 %c%s 设定符,则 A 是字符向量。如果您还指定 sizeA,则 A 是字符数组,并且必要时会使用空字符填充。(空字符是值为零的控制字符。)如果输入包含的字符数少于 sizeA 个,则 A 将小于 sizeA。它是存储从输入扫描的字符所需的大小。

  • 如果 formatSpec 包含数值设定符和字符设定符的组合,则 Adouble 类的数值,sscanf 将每个字符转换为与其对等的数值。即使 formatSpec 显式跳过所有数值字段(例如,formatSpec'%*d %s'),也将发生此转换情况。

  • 如果 sscanf 无法将所有输入与 formatSpec 相匹配,则 A 可以是数值或字符数组。A 的类取决于 sscanf 在停止处理之前读取的值。

数据类型: double | int64 | uint64 | char

读入输出数组的元素数目,以整数形式返回。

数据类型: double

错误消息,以字符向量形式返回。如果 str 包含 sscanf 无法转换的任何数据,则 errmsg 包含错误消息。如果 sscanf 成功转换所有数据,则 errmsg 是空字符向量。

数据类型: char

最后一个扫描的字符后的位置,以整数形式返回。

数据类型: double

提示

  • 读取函数 sscanffscanf 的格式设定符不同于写入函数 sprintffprintf 的格式。读取函数不支持精度字段。宽度字段在写入函数中指定最小值,但在读取函数中指定最大值。

在 R2006a 之前推出