字符数组 #

一、字符数组概述 #

字符数组(char array)是MATLAB传统的文本类型,使用单引号创建:

matlab
% 字符数组
str = 'Hello World';
class(str)    % 'char'

% 与字符串对比
str2 = "Hello World";
class(str2)   % 'string'

二、创建字符数组 #

2.1 基本创建 #

matlab
% 单引号创建
str1 = 'Hello';
str2 = '世界';
str3 = '123';

% 空字符数组
empty_char = '';

% 字符数组连接
str = ['Hello', ' ', 'World'];  % 'Hello World'

2.2 特殊字符 #

matlab
% 转义字符(使用双单引号)
str1 = 'It''s a test';     % It's a test

% 特殊控制字符
str2 = ['Line1', newline, 'Line2'];
str3 = ['Col1', char(9), 'Col2'];  % Tab

% 常用控制字符
backspace = char(8);   % 退格
tab = char(9);         % 制表符
newline = char(10);    % 换行
carriage = char(13);   % 回车

2.3 多行字符数组 #

matlab
% 使用分号
str = ['Line 1'; 'Line 2'; 'Line 3'];

% 注意:每行长度必须相同
% str = ['Hello'; 'Hi'];  % 错误:长度不同

% 使用char函数自动填充
str = char('Hello', 'Hi', 'Hey');
% 结果:
% Hello
% Hi   
% Hey  

% 使用cell数组
cells = {'Line 1'; 'Line 2'; 'Line 3'};
str = char(cells);

三、字符数组操作 #

3.1 索引访问 #

matlab
str = 'Hello World';

% 单个字符
ch = str(1);      % 'H'
ch = str(end);    % 'd'

% 子串
sub = str(1:5);   % 'Hello'
sub = str(7:end); % 'World'

% 反向索引
sub = str(end:-1:1);  % 'dlroW olleH'

3.2 连接 #

matlab
% 水平连接
str1 = 'Hello';
str2 = 'World';
str = [str1, ' ', str2];  % 'Hello World'

% 使用strcat
str = strcat(str1, str2); % 'HelloWorld'(注意无空格)
str = strcat(str1, ' ', str2);  % 'Hello World'

% 使用horzcat
str = horzcat(str1, ' ', str2);

3.3 分割 #

matlab
str = 'Hello World MATLAB';

% 按空格分割
parts = strsplit(str);  % {'Hello', 'World', 'MATLAB'}

% 指定分隔符
str = 'a,b,c,d';
parts = strsplit(str, ',');  % {'a', 'b', 'c', 'd'}

% 限制分割次数
parts = strsplit(str, ',', 'DelimiterType', 'RegularExpression');

3.4 查找与替换 #

matlab
str = 'Hello World World';

% 查找
pos = strfind(str, 'World');  % [7, 13]

% 替换
new_str = strrep(str, 'World', 'MATLAB');
% 'Hello MATLAB MATLAB'

% 大小写转换
upper(str)   % 'HELLO WORLD WORLD'
lower(str)   % 'hello world world'

3.5 去除空白 #

matlab
str = '  Hello World  ';

% 去除两端空白
trimmed = strtrim(str);  % 'Hello World'

% 去除右侧空白
deblank(str);  % '  Hello World'

% 注意:strtrim和deblank只处理空白字符

四、字符数组与字符串转换 #

4.1 字符数组转字符串 #

matlab
% string函数
char_arr = 'Hello World';
str = string(char_arr);  % "Hello World"

% 多行字符数组
char_arr = ['Line 1'; 'Line 2'];
str = string(char_arr);  % ["Line 1"; "Line 2"]

4.2 字符串转字符数组 #

matlab
% char函数
str = "Hello World";
char_arr = char(str);  % 'Hello World'

% 字符串数组
strs = ["Hello", "World"];
char_arr = char(strs);  % 多行字符数组
% Hello
% World

4.3 cell数组转换 #

matlab
% 字符数组cell
cells = {'Hello', 'World'};

% 转为字符数组
char_arr = char(cells);  % 多行字符数组

% 转为字符串数组
strs = string(cells);    % ["Hello", "World"]

% 字符数组转cell
str = 'Hello';
cell_str = cellstr(str);  % {'Hello'}

% 多行字符数组转cell
str = ['Line 1'; 'Line 2'];
cells = cellstr(str);  % {'Line 1'; 'Line 2'}

五、字符与ASCII码 #

5.1 字符转ASCII #

matlab
% double函数
ch = 'A';
code = double(ch);  % 65

% 字符串转ASCII数组
str = 'Hello';
codes = double(str);  % [72 101 108 108 111]

% abs函数
code = abs('A');  % 65

5.2 ASCII转字符 #

matlab
% char函数
code = 65;
ch = char(code);  % 'A'

% ASCII数组转字符串
codes = [72 101 108 108 111];
str = char(codes);  % 'Hello'

% 生成字母表
letters = char(65:90);   % 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
letters = char(97:122);  % 'abcdefghijklmnopqrstuvwxyz'

5.3 常用ASCII值 #

字符 ASCII值
‘0’-‘9’ 48-57
‘A’-‘Z’ 65-90
‘a’-‘z’ 97-122
空格 32
换行 10
制表符 9

六、字符数组比较 #

6.1 相等比较 #

matlab
str1 = 'Hello';
str2 = 'World';
str3 = 'Hello';

% strcmp
strcmp(str1, str2)  % 0(false)
strcmp(str1, str3)  % 1(true)

% 忽略大小写
strcmpi('Hello', 'HELLO')  % 1(true)

% 比较前n个字符
strncmp('Hello', 'Help', 3)    % 1
strncmpi('Hello', 'HELP', 3)   % 1

6.2 字典序比较 #

matlab
% 比较字符数组
str1 = 'apple';
str2 = 'banana';

% 直接比较(逐字符比较ASCII值)
str1 < str2   % 逐元素比较

% 使用sort排序
fruits = {'banana', 'apple', 'cherry'};
sorted = sort(fruits);  % {'apple', 'banana', 'cherry'}

七、格式化输出 #

7.1 sprintf #

matlab
% 格式化字符串
name = '张三';
age = 25;
str = sprintf('%s今年%d岁', name, age);
% '张三今年25岁'

% 格式说明符
% %s - 字符串
% %c - 单个字符
% %d - 整数
% %f - 浮点数
% %e - 科学计数法

% 精度控制
pi_str = sprintf('%.4f', pi);  % '3.1416'

7.2 fprintf #

matlab
% 输出到命令窗口
fprintf('Hello %s\n', 'World');

% 输出到文件
fid = fopen('output.txt', 'w');
fprintf(fid, '数据: %d\n', 42);
fclose(fid);

八、实用示例 #

8.1 字符串处理 #

matlab
% 统计字符出现次数
function count = countChar(str, ch)
    count = sum(str == ch);
end

% 示例
str = 'Hello World';
count = countChar(str, 'l');  % 3

8.2 文本解析 #

matlab
% 解析CSV行
line = '张三,25,北京,工程师';

% 方法1:strsplit
fields = strsplit(line, ',');
name = fields{1};
age = str2double(fields{2});

% 方法2:textscan
data = textscan(line, '%s%d%s%s', 'Delimiter', ',');
name = data{1}{1};
age = data{2};

8.3 文件名处理 #

matlab
% 提取文件扩展名
function ext = getFileExtension(filename)
    [~, ~, ext] = fileparts(filename);
end

% 提取文件名(不含扩展名)
function name = getFileName(filename)
    [~, name, ~] = fileparts(filename);
end

% 示例
filename = 'data_2024.csv';
ext = getFileExtension(filename);  % '.csv'
name = getFileName(filename);      % 'data_2024'

九、字符数组 vs 字符串 #

9.1 主要区别 #

特性 字符数组 (char) 字符串 (string)
创建方式 单引号 ' ' 双引号 " "
类型 字符数组 string对象
索引 字符级别 字符串级别
内存 连续存储 对象引用
推荐度 兼容旧代码 新项目推荐

9.2 使用建议 #

matlab
% 新项目:优先使用string
str = "Hello World";
parts = split(str);  % 更直观

% 需要兼容旧代码:使用char
str = 'Hello World';

% 性能敏感场景:char可能更快
% 大量字符串操作:string更方便

十、总结 #

本章学习了:

  1. 创建字符数组:单引号、char函数
  2. 操作字符数组:索引、连接、分割、查找替换
  3. 类型转换:char与string互转
  4. ASCII码:字符与编码转换
  5. 比较操作:strcmp、strcmpi
  6. 格式化输出:sprintf、fprintf
  7. 与字符串的区别:选择合适的类型

下一章将学习MATLAB的逻辑类型。

最后更新:2026-03-27