Использование индекса для поиска нескольких символов

В моем проекте Arduino будет получена строка. Я понимаю использование .indexof для поиска расположения определенного символа в строке. Моя проблема в том, что мне нужно найти первое вхождение любой буквы A-Z и я не нашел никаких ресурсов, касающихся использования или операторов в .indexof, он же строка.indexof("a" || "b"....).

Является ли это чем-то невозможным с помощью функций indexof, и если да, то есть ли какая-либо функция, которую я могу использовать для решения этой проблемы! Спасибо!

, 👍0

Обсуждение

индекс предназначен только для одного сравнения за раз. есть встроенный " isupper(символ)`: http://www.cplusplus.com/reference/cctype/isupper/. вы можете найти сразу много символов, используя https://www.cplusplus.com/reference/cstring/strcspn/, @dandavis

Вы также можете использовать цикл for, который проверяет значение i (или любой другой переменной), а затем, в зависимости от того, что я такое, он запускает indexof с разными буквами., @RMCodes


1 ответ


2

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

Видишь https://www.arduino.cc/reference/en/language/functions/characters/isalpha/

Обновление:

Благодаря замечательным комментариям от Edgar & Mat я обновил функции с учетом лучших практик и улучшений затрат.

int alphaPos(const char* str)
{
  for (int i = 0; str[i] !=0 ; ++i) {
    if (isAlpha(str[i]))
    {
      return i;
    }
  }
  
  return -1;
}


int alphaPos(const String& str)
{
  return alphaPos(str.c_str());
}

/*
    Usage:

    String bobble = "&&&88434a";
    int x = alphaPos(bobble);

    if (x != -1) 
    {
      ...x has the position in the string
    }
    else
    {
     ...There is no alpha char present.
    }
*/
,

Я предлагаю передать ссылку " const` на вторую перегрузку., @Edgar Bonet

@EdgarBonet, я признаю, что мне еще многому нужно научиться, поэтому честно спросите, в чем выгода?, @voidPointer

@voidPointer: это указывает вызывающему, что функция не будет изменять переданную строку. Это хорошая практика. Также вы можете избежать вызова "strlen" (что удваивает стоимость функции) - вместо этого используйте " str[i] != 0` в условии цикла., @Mat

@Мат. Спасибо. Этот совет strlen довольно крут и тоже поможет другим., @voidPointer

Чтобы подробнее прокомментировать комментарий Мэта: если вы хотите получить представление о том, почему это считается хорошей практикой, см. [Const Correctness](https://isocpp.org/wiki/faq/const-correctness) на isocpp.org вики., @Edgar Bonet

@EdgarBonet Это хорошее чтение. Спасибо., @voidPointer