You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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个格式符,第一次处理流程是:

  1. %s匹配str → 输出"Turn : "
  2. %d匹配r(1) → 输出5
  3. %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

火山引擎 最新活动