2013-03-15 182 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