Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

有关字符串数组的常见问题解答

MATLAB® 在 R2016b 中引入了 string 数据类型。从 R2018b 开始,您可以使用字符串数组处理 MathWorks® 产品中的文本。字符串数组可存储文本片段,并提供一组用于将文本按数据进行处理的函数。您可以对字符串数组进行索引、重构和进行串联,就像处理任何其他类型的数组一样。有关详细信息,请参阅创建字符串数组

字符串数组的行为大多数方面与字符向量和字符向量元胞数组类似。但是,字符串数组和字符数组之间存在一些关键差异,这些差异可能会导致意外的结果。对于所有这些差异,按推荐的方法来使用字符串,便可获得预期的结果。

为什么在命令形式中使用字符串会返回错误?

以命令形式使用 cddircopyfileload 等函数时,应避免使用双引号。在命令形式中,放在双引号中的参数可能会导致错误。要将参数指定为字符串,请使用函数形式。

对于命令语法,应该用空格而不是逗号来分隔输入,而且不需要将输入参数放在括号中。例如,您可以将 cd 函数与命令语法结合使用来更改文件夹。

cd C:\Temp

文本 C:\Temp 是一个字符向量。在命令形式中,所有参数都始终为字符向量。如果您有一个包含空格的参数(例如文件夹名称),请将其放在单引号中以作为一个输入参数来指定。

cd 'C:\Program Files'

但是,如果使用双引号指定参数,cd 将引发错误。

cd "C:\Program Files"
Error using cd
Too many input arguments.

根据您使用的函数和指定的参数,错误消息可能有所不同。例如,如果您将 load 函数与命令语法结合使用,并使用双引号来指定参数,则 load 将引发不同的错误。

load "myVariables.mat"
Error using load
Unable to read file '"myVariables.mat"': Invalid argument.

在命令形式中,双引号被视为字面文本的一部分,而不是字符串构造运算符。如果您以函数形式编写等效的 cd "C:\Program Files",则它看起来会像是在用两个参数调用 cd

cd('"C:\Program','Files"')

以字符串形式指定参数时,请使用函数语法。支持命令语法的所有函数也支持函数语法。例如,您可以将 cd 与函数语法结合使用,并以带双引号的字符串形式指定输入参数。

cd("C:\Program Files")

为什么元胞数组中的字符串返回错误?

如果有多个字符串,请将它们存储在字符串数组而不是元胞数组中。使用方括号而不是花括号创建字符串数组。在存储和操作文本方面,字符串数组比元胞数组更高效。

str = ["Venus","Earth","Mars"]
str = 1×3 string array
    "Venus"    "Earth"    "Mars"

请避免使用字符串元胞数组。如果您使用元胞数组,便意味着您放弃了使用字符串数组带来的性能优势。事实上,大多数函数都不接受将字符串元胞数组作为输入参数、选项或者作为名称-值对组的值。例如,如果指定字符串元胞数组作为输入参数,则 contains 函数将引发错误。

C = {"Venus","Earth","Mars"}
C = 1×3 cell array
    {["Venus"]}    {["Earth"]}    {["Mars"]}
TF = contains(C,"Earth")
Error using contains
First argument must be a string array, character vector, or cell array of character vectors.

这种情况下,应以字符串数组形式指定参数。

str = ["Venus","Earth","Mars"];
TF = contains(str,"Earth");

在 R2016b 之前,“字符串元胞数组”是指其元素全部为字符向量的元胞数组。但是,为了与字符串数组区分开来,将这类元胞数组称为“字符向量元胞数组”更为准确。

元胞数组可以包含任何数据类型的变量,包括字符串。仍然可以创建其元素全部为字符串的元胞数组。而且,如果您已经在代码中指定字符向量元胞数组,则将单引号替换为双引号可能看起来就像一次简单的更新。但是,不建议您创建或使用字符串元胞数组。

为什么使用 length() 调用字符串会返回 1?

length 函数通常用于确定字符向量中的字符数。但是,要确定字符串中的字符数,请使用 strlength 函数,而不是 length

使用单引号创建一个字符向量。要确定其长度,请使用 length 函数。由于 C 是向量,因此它的长度等于字符数。C 是一个 1×11 向量。

C = 'Hello world';
L = length(C)
L = 11

使用双引号创建具有相同字符的字符串。虽然它存储 11 个字符,但 str 是一个 1×1 字符串数组,或者说字符串标量。如果使用 length 调用字符串标量,则无论它存储多少个字符,输出参数都为 1

str = "Hello World";
L = length(str)
L = 1

要确定字符串中的字符数,请使用在 R2016b 中引入的 strlength 函数。为了实现兼容性,strlength 仍然可用于字符向量。在这两种情况下,strlength 都返回字符数。

L = strlength(C)
L = 11
L = strlength(str)
L = 11

strlength 还可用于包含多个字符串的字符串数组以及字符向量元胞数组。

length 函数返回数组的最长维度的大小。对于字符串数组,length 返回数组最长维度的字符串的数量,而不返回字符串的字符数。

为什么 isempty("") 返回 0?

一个字符串可以不包含任何字符。这样的字符串称为空字符串。您可以使用一对不包含任何内容的双引号来指定空字符串。

L = strlength("")
L = 0

但是,空字符串并不是空数组。空字符串是刚好没有任何字符的字符串标量。

sz = size("")
sz = 1×2    
     1     1

如果对空字符串调用 isempty,将返回 0 (false),因为它并不是空数组。

tf = isempty("")
tf = logical
   0

但是,如果对空字符数组调用 isempty,则返回 1 (true)。用一对空单引号 '' 指定的字符数组是一个 0×0 字符数组。

tf = isempty('')
tf = logical
   1

要测试一段文本是否不包含任何字符,最佳做法是使用 strlength 函数。无论输入是字符串标量还是字符向量,都可以使用相同的调用。

str = "";
if strlength(str) == 0
    disp('String has no text')
end
String has no text
chr = '';
if strlength(chr) == 0
    disp('Character vector has no text')
end
Character vector has no text

为什么使用方括号追加字符串返回多个字符串?

可以使用方括号在字符向量后面追加文本。但是,如果使用方括号向字符串数组添加文本,新文本将作为字符串数组的新元素进行串联。要为字符串追加文本,请使用 plus 运算符或 strcat 函数。

例如,如果串联两个字符串,则结果是一个 1×2 字符串数组。

str = ["Hello" "World"]
str = 1×2 string array
    "Hello"    "World"

但是,如果串联两个字符向量,则结果是一个更长的字符向量。

str = ['Hello' 'World']
chr = 'HelloWorld'

要为字符串(或字符串数组的元素)追加文本,请使用 plus 运算符而不是方括号。

str = "Hello" + "World"
str = "HelloWorld"

另外,也可以使用 strcat 函数。无论输入参数是字符串还是字符向量,都可以使用 strcat 追加文本。

str = strcat("Hello","World")
str = "HelloWorld"

不管使用方括号、plus 还是 strcat,都可以指定任意数量的参数。在 HelloWorld 之间追加一个空白字符。

str = "Hello" + " " + "World"
str = "Hello World"

另请参阅

| | | | | | | | | | | |

相关主题