2013-03-15 181 views
1

我想比较两个字符串,但我未能实现。为什么?字符串比较C - strcmp()

#include <stdio.h> 
#include <string.h> 

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 
+2

但是这两个字符串显然是不同的,所以'的strcmp()'工作,因为它应该。 – NPE 2013-03-15 10:57:21

+0

尝试打印两个c和b字符串... – Joe 2013-03-15 10:58:57

+0

哦.....所以我的sprinf工作不正确... – 2013-03-15 10:59:52

回答

10

这两个字符串是明显不同的,所以strcmp()正在工作,因为它应该。

问题是1231.23123不能表示为float。实际上,可以表示为float的最近数字是1231.231201171875,这就是您所看到的(以sprintf()四舍五入到小数点后六位)。

3

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

2

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

1231.23123 
1231.231201 

它们的确不同,从而strcmp返回非零值。

这里的实际问题是,当你做float a = 1231.23123;,要在a存储的号码不能被表示为float,可以表示为float在这种情况下1231.231201171875最接近的数字。看看OMG Ponies!!! (Aka Humanity: Epic Fail);)


解决你的问题,我将开始使用double代替float以获得更精确的精度。然后,你可以指定精度(%.5lf),同时打印这个数字串入,以确保该数字将被四舍五入,就像你需要它:

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

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

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

这导致了问题 - 为什么它[在结束](https://ideone.com/iZg7sm)如果你省略'.5'? – Dukeling 2013-03-15 11:24:10

+0

@Dukeling - 因为'%f'打印了6位小数,除非您另有说明。 – teppic 2013-03-15 11:24:49

+0

所以我认为更通用的解决方案是将字符串设置为“1231.231230”(并省略“.5”)。 – Dukeling 2013-03-15 11:26:24