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

+0

Попробуйте распечатать BOTH c и b строки ... – Joe

+0

О, да, поэтому мой sprinf работает неправильно ... –

ответ

10

Две строки явно разные, поэтому strcmp() работает как следует.

Вопрос заключается в том, что 1231.23123 не может быть представлен как float. Фактически, ближайшее число, которое может быть представлено как float, равно 1231.231201171875, это то, что вы видите (округленное на sprintf() до шести знаков после запятой).

3

Это потому, что точность поплавка не может поддерживать так много цифр. Таким образом, b не является «1231.23123». В моем тесте это «1231.231201».

2

Вы сравниваете эти 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

Если вы хотите определенное количество цифр для сравнения в string, используйте спецификатор точности в sprintf - %.5f, и, как указывали другие, номер, который вы выбрали, не может быть представлен float, но может быть представлен double. то есть

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

Что приводит к вопросу - Почему это [добавить 0 на end] (https://ideone.com/iZg7sm), если вы опустите '.5'? – Dukeling

+0

@ Dukeling - потому что '% f' печатает 6 знаков после запятой, если вы не сообщите об этом иначе. – teppic

+0

Итак, я думаю, что более общим решением было бы иметь строку «1231.231230» (и опуская '.5'). – Dukeling

Смежные вопросы