C++ k近邻聚类程序for循环输出异常:字符前出现不明数字
字符前出现不明数字的原因分析
问题场景
我用C++编写了一个针对示例数据的k近邻聚类简易程序,目前处于算法第一次迭代阶段。发现char point[] = {...}数组输出异常:原本期望输出{A B C D … H}这类纯字母,实际输出却带有字符前的不明数字。输出示例如下:
A C2 2 4B C1 2.23607 9C C1 2.82843 17D C1 3.60555 30E C2 1 31F C1 2.23607 36G C2 0 36H C1 0 36 Process returned 0 (0x0) execution time : 0.031 s Press any key to continue.
对应的代码如下:
#include <iostream> #include <math.h> using namespace std; int main() { char point[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'}; float x[] = {1, 3, 4, 5, 1, 4, 1, 2}; float y[] = {3, 3, 3, 3, 2, 2, 1, 1}; float m1[] = {x[(sizeof(x)/sizeof(float))-1], y[(sizeof(y)/sizeof(float))-1]}; float m2[] = {x[(sizeof(x)/sizeof(float))-2], y[(sizeof(y)/sizeof(float))-2]}; string group[8]; float sumdq =0; for(int i=0;i<=sizeof(point)-1;i++) { float d1 = sqrt(pow(x[i]-m1[0],2) + pow(y[i]-m1[1],2)); float d2 = sqrt(pow(x[i]-m2[0],2) + pow(y[i]-m2[1],2)); if(d1<d2) { group[i] = "C1"; sumdq =sumdq + pow(d1,2); cout<<point[i]<< " "<<group[i]<< " "<<d1<<endl; } else { group[i] = "C2"; sumdq =sumdq + pow(d2,2); cout<<point[i]<< " "<<group[i]<< " "<<d2<<endl; } cout<<sumdq; } return 0; }
原因拆解
这些数字并非字符本身的问题,而是上一次循环输出的sumdq值:你在每次循环末尾执行了cout<<sumdq;但没有添加换行符,导致sumdq的输出和下一次循环的字符连在了一起:
- 第一次循环:输出
A C2 2后,打印4(sumdq=2²=4),无换行 - 第二次循环:直接输出
B C1 2.23607,就会跟在之前的4后面,变成4B... - 后续循环以此类推,每次末尾的sumdq残留导致了字符前的数字
另外补充一个潜在问题:for(int i=0;i<=sizeof(point)-1;i++)的写法虽然当前能运行,但更规范的写法是i < sizeof(point)/sizeof(point[0]),避免手动计算长度出错。
解决方法
根据需求调整输出逻辑即可:
- 如果需要每次循环单独打印sumdq,在末尾添加换行符:
cout<<sumdq<<endl; - 如果只需要最终的总sumdq,把
cout<<sumdq;移到循环外部:for(...) { // 循环内原有逻辑 } cout<<sumdq<<endl;
内容的提问来源于stack exchange,提问作者Piotr
相关产品推荐
相关产品推荐

