C++实现fiboEncoding函数输出总偏移到最左侧,如何排查修复
输出错位的核心原因
你遇到的编码串跑到输出最左侧、和提示文字错位的问题,和控制台排版设置没有关系,是两处代码逻辑写错导致的:
- 第一处:函数写错了职责,打乱了输出顺序
你本来设计fiboEncoding()的作用是接收整数、返回对应的斐波那契编码字符串,但在函数实现里,你直接把存在数组里的编码字符通过cout打到了控制台:
对照代码实际执行流程:main函数调用for (int j = 0; j < v.size() - 1; j++) { cout << v[j]; }fiboEncoding(n)的瞬间,这段打印逻辑就会执行,直接把编码串从控制台最左端打出来——这时候main里写的cout << "code: "还根本没运行。等函数执行完返回,才轮到打印code:和返回值,完全颠倒了你预期的输出顺序,看起来就像编码串孤零零飘在输出最左边。 - 第二处:函数从来没给要返回的字符串赋过值
你在函数开头定义了空的string word;,但全程没把算好的编码内容拼进去,函数最后返回的永远是空串,这也是为什么code:后面接不到任何编码内容的原因。 - 顺带提个容易踩坑的问题:你用
vector<char> v(r+3)创建字符数组时,所有元素的初始值是随机未定义的,如果编码赋值逻辑漏了某个位置,直接打印就会出乱码、显示异常字符。
具体修正方法
- 删掉函数内部直接打印编码的逻辑,改成把每个编码字符拼接到要返回的
word字符串里 - 初始化vector时给所有元素设默认值
'0',避免随机脏数据干扰 - 所有控制台输出统一放到main函数里做,保证输出顺序和你预期的一致
修正后的核心代码
string fiboEncoding(int n) { string word; int fib[1000]; fib[0] = 1; fib[1] = 2; int i = 0; for(i = 2; fib[i-1] <= n; i++) { fib[i] = fib[i-1] + fib[i-2]; } int r = i - 2; int index = r; // 给所有元素初始值为'0',避免随机脏数据 vector<char> v(r+3, '0'); while(n > 0) { v[index] = '1'; n = n - fib[index]; index = index - 1; while (index >= 0 && fib[index] > n) { v[index] = '0'; index = index - 1; } } v[r + 1] = '1'; // 替换原来的直接打印逻辑为拼接返回值 for (int j = 0; j < v.size() - 1; j++) { word += v[j]; } return word; }
改完之后,函数只会负责计算编码、不会抢着做输出,main会按顺序先打code: 再接上完整的编码串,错位问题自然就解决了。
内容的提问来源于stack exchange,提问作者Lioncake
相关产品推荐
相关产品推荐

