Проверка на разные символы в C - PullRequest
1 голос
/ 27 апреля 2020

Я хотел знать, есть ли способ в c проверить, например, в функции for, равна ли переменная или не равна определенным символам без необходимости повторять каждый раз проверку равенства. Если я не ошибаюсь, проверка равенства таким образом некорректна:

if (a == ('\n' || '\t' || ' ' || ',' || '.' || ';' || ':' || '!' || '?')) {
     execute certain action;
}

вам потребуется бесконечная цепочка a == '\n' || a == '\t' || .... Мне было интересно, есть ли более короткий (и более чистый) способ проверить равенство для списка символов, потому что, когда вместо a у вас есть что-то более наглядное, этот код становится беспорядочным. Кроме того, если бы вы могли объяснить мне, почему первая часть не так, я был бы признателен.

Ответы [ 3 ]

5 голосов
/ 27 апреля 2020

Вы можете использовать strchr() для поиска символа в строке.

#include <string.h>

if (strchr("\n\t ,.;:!?", a) != NULL) {
    // execute certain action
}

Причина, по которой ваша попытка не работает, заключается в том, что оператор || объединяет все свои операнды с помощью логической операции OR и возвращает логическое значение. x || y имеет значение true, если x или y отличны от нуля. Таким образом, ваш тест по сути эквивалентен

if (a == 1)
3 голосов
/ 27 апреля 2020

Просто напишите функцию, подобную следующей

#include <string.h>

//...

int is_separatison( char c )
{
    const char *s = "n\t ,.;:!?";

    return c != '\0' && strchr( s, c ) != NULL;
}

То же выражение, которое вы можете использовать в операторе if. Только вы можете удалить сравнение с нулевым символом, если вы знаете, что проверенный символ не является нулевым символом.

const char *s = "n\t ,.;:!?";

if ( strchr( s, c ) != NULL )
{
    // do something
}

Что касается показанного вами оператора if, то оно должно быть переписано как

if ( a == '\n' || a == '\t' || a == ' ' || a == ',' || 
     a == '.'  || a ==';'   || a == ':' || a == '!' || a == '?' )  {
1 голос
/ 27 апреля 2020

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

Итак, в вашем случае вы можете сделать это:

if (strchr("\n\t ,.;:!?", a) == NULL) {
    // Action when NOT found
}
else {
    // Action when found
}

( Вам нужно #include <string.h> где-нибудь в вашем источнике, чтобы использовать эту функцию.)

...