MATLAB R2019a中fprintf函数输出不符合预期的问题
解决MATLAB中fprintf输出乱码的问题
我来帮你捋清楚这个问题的根源,以及怎么修复~
首先,你遇到的问题核心是MATLAB的fprintf对输入参数的处理逻辑和disp完全不同:
- 当你用
disp("Turn : " + r + " " + t)时,MATLAB会自动做元素级的字符串拼接:因为r和t都是1×51的数组,"Turn : "会被自动扩展成同长度的字符串数组,然后每个位置和对应的r(i)、t(i)拼接,生成51个完整的字符串,disp会逐个输出这些字符串,所以一切正常。 - 但fprintf是按格式符的顺序,依次匹配所有输入参数的元素(数组会被按列展开成单个元素),当格式符用完后会循环重复格式串,这就是乱码的起因。
你原来的代码fprintf("%s %d %d",str,r,t)出问题的具体原因:
str是单个字符串(仅1个元素),r是51个元素,t是51个元素,总共有1+51+51=103个元素要处理。格式串%s %d %d有3个格式符,第一次处理流程是:
%s匹配str → 输出"Turn : "%d匹配r(1) → 输出5%d匹配r(2) → 输出6
接下来格式串循环,下一个%s需要匹配字符串,但此时剩下的第一个元素是r(3)(数值类型),MATLAB尝试把数值当字符串解析,自然就出现乱码了。
修复方案(三种常用方法)
方法1:直接把固定字符串写进格式串(最简单)
既然"Turn : "是固定文本,没必要单独存成变量,直接整合到格式串里,同时加上换行符\n让每组结果单独一行:
clc; clear all; K = 100; r = 5:1:55; W = 10; t = round((2*K.*r.^2+W^2)./60); fprintf("Turn : %d %d\n", r, t);
这样fprintf会循环使用"Turn : %d %d\n",每次取r的一个元素和t的一个元素,刚好匹配51组,完美输出所有结果。
方法2:如果一定要用str变量,让它和r/t长度一致
如果你必须保留str变量,可以把它复制成和r、t同长度的字符串数组,这样每个格式串循环都能正确匹配到字符串、r(i)、t(i):
clc; clear all; K = 100; r = 5:1:55; W = 10; t = round((2*K.*r.^2+W^2)./60); str = repmat("Turn : ", 1, length(r)); % 复制成1×51的字符串数组 fprintf("%s %d %d\n", str, r, t);
方法3:用循环逐个输出(最直观)
如果想更清晰控制每一次输出,用for循环逐个处理每个元素:
clc; clear all; K = 100; r = 5:1:55; W = 10; t = round((2*K.*r.^2+W^2)./60); str = "Turn : "; for idx = 1:length(r) fprintf("%s %d %d\n", str, r(idx), t(idx)); end
这样三种方法都能解决你遇到的乱码问题,按你的需求选就行~
内容的提问来源于stack exchange,提问作者ivbtar




