2016-04-07 2 views
1

Я пытаюсь использовать fgets для вызова различных функций в зависимости от того, какую строку вводит пользователь. Я знаю, что мне нужно будет использовать strtok позже, так как будут места для, например, «load 12». Но теперь я смущен тем, что использую strcmp для сравнения введенных строк. Я знаю, что strcmp может использоваться следующим образом:Могу ли я использовать strcmp как логическое?

int check; 
char string[10] = "test"; 

check = strcmp(string, "test"); 
// Check will be 0 if true 

if (check == 0) 
{ 
    printf("same string\n"); 
} 
else 
{ 
    printf("not the same\n"); 
} 

Может ли это быть логическим значением, как true и false? Если «test» на самом деле «test», логическое значение становится истинным, тогда я буду использовать логическое значение в операциях if.

+0

Вы не используете его как булево. 'check' является целым числом и сравнивает его с другим целым числом. – Barmar

+0

Да, вы можете, но возвращаемое значение 'strcmp' в булевом контексте было бы истинным (ненулевое значение), если строки ** отличаются ** и false, если они этого не делают ... поэтому я предпочитаю сравнивать' == 0'. –

+1

Если вы хотите протестировать логические значения 'true' и' false', инверсия будет не только инвертирована, но и функция не обязательно возвращает '1', только положительное значение, поэтому вы не можете использовать' if (strcmp (string, "test") == true) ' –

ответ

1

if (strcmp(string, "test") == 0) проверяет, одинаковы ли обе строки.

Возвращаемое значение strcmp(..) является целым числом, и если обе строки одинаковы, возвращаемое значение является целым числом 0. Так эффективно вы сравниваете, если 0 == 0, и так все в порядке.

2

Вы можете написать и использовать обертку/вспомогательную функцию для достижения этой цели, что-то вроде этого:

bool are_equal(char* a, char* b) 
{ 
    return strcmp(a, b)==0; 
} 
1

strcmp() возвращает целое значение 0, когда строки равны. Для булевых проверок все, кроме целого числа 0 в c, считается истинным, а целое число 0 объединяется как false.

Так что да, ваш подход будет работать.

+1

Вот и ответ. – haccks

0

Проблема с strcmp и другими такими функциями заключается в том, что они возвращаются к моменту, когда C не имеет булевского типа. Поэтому они определяют «не равно» как целое число, большее или меньшее нуля, в зависимости от того, будет ли первая строка больше или меньше второй. Внутри реализации strcmp, вы могли бы найти что-то вроде

int strcmp(const char *s1, const char *s2) 
{ 
    ... 
    if(*s1 != *s2) 
    { 
    return *s1 - s2* 
    } 
    ... 
    return 0; 
} 

Это означает, что в случае, если строки не равны, то функция может возвращать любое число, равное разнице между кодами символов для первых неравных символов найденный.

Вы можете решить эту проблему путем проектирования оберток вокруг strcmp:

inline bool is_equal (const char* s1, const char* s2) 
{ 
    return strcmp(s1, s2) == 0; 
} 

inline bool is_greater (const char* s1, const char* s2) 
{ 
    return strcmp(s1, s2) > 0; 
} 

inline bool is_less (const char* s1, const char* s2) 
{ 
    return strcmp(s1, s2) < 0; 
} 

И теперь вы можете заметить, что первоначальное определение возвращаемого значения strcmp «s не так глуп, как кажется, потому что это означало, что они могли бы написать 1 функцию вместо 3. Что очень удобно, когда вы пишете функции сравнения для bsearch, qsort и т. д.

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