字符串比较C – strcmp()

我试图比较两个字符串,但我没有实现这一点。 为什么?

#include  #include  int main(){ float a = 1231.23123; char b[32]; sprintf(b, "%f", a); printf("%s\n", b); char c[32] = "1231.23123"; if (strcmp(c, b) == 0){ printf("SUCCES\n"); } else{ printf("DIFFER\n"); } return 0; } 

结果:

 1231.231201 DIFFER 

这两个字符串明显不同,因此strcmp()正常工作。

问题是1231.23123不能表示为float 。 事实上,最接近的数字可以表示为float1231.231201171875 ,这是你所看到的(由sprintf()舍入到六位小数)。

如果你想在字符串中比较一组数字,请使用sprintf%.5f的精度说明%.5f ,正如其他人所指出的那样,你选择的数字不能用float表示,但可以用double 。 即

 double a = 1231.23123; char b[32]; sprintf(b, "%.5f",a); 

这是因为浮点数的精度不能支持这么多数字。 所以b不是“1231.23123”。 在我的测试中,它是“1231.231201”。

您在这里比较这两个字符串:

 1231.23123 1231.231201 

确实不同,因此strcmp返回非零值。

这里的实际问题是当你做float a = 1231.23123; ,您要存储在a中的数字不能表示为float ,在这种情况下,可以表示为float的最近数字是1231.231201171875 。 看看OMG小马! (阿卡人性:史诗般的失败) ;)


为了解决您的问题,我将首先使用double而不是float来获得更精确的准确性。 然后,您可以在将此数字打印到字符串中时指定精度( %.5lf ),以确保数字按照您的需要进行舍入:

 double d = 1231.23123; char str[32]; sprintf(str, "%.5lf", d); // strcmp(str, "1231.23123") would return 0 here