нерекурсивная проверка содержимого строки переменной длины - PullRequest
1 голос
/ 27 апреля 2011

У меня есть функция, которая принимает символ * переменной длины и длины.Я хочу проверить, все ли его содержимое является пробелами.

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

Ответы [ 3 ]

4 голосов
/ 27 апреля 2011

Просто пройдитесь по символам и проверьте пробелы (например, с помощью функции isspace).

В качестве альтернативы, преобразуйте char* в std::string и используйте строковые функции, то есть find_first_not_of. Например, используя «обычные» пробельные символы в кодировках до Unicode:

bool is_all_spaces(char const* text, unsigned len) {
    string str(text, len);
    return str.find_first_not_of(" \t\r\n\v\f") == string::npos;
}

Более причудливое распознавание пробелов могло бы справиться с произвольными кодировками / локалями текста. По этой причине использование isspace, вероятно, лучше, чем find_first_not_of.

В любом случае, использование memcmp в C ++ в любом случае не рекомендуется, и вы, как правило, предпочитаете строки C ++ вместо массивов символов в стиле C.

2 голосов
/ 27 апреля 2011

Достаточно эффективный способ ответить на это точное требование:

bool is_whitespace(const char* p, size_t n)
{
    while (n--)
        if (!isspace(static_cast<unsigned char>(*p++)))
            return false;
    return true;
}

В целом, лучше попытаться сохранить такие данные в std::string переменных, что делает такие решения, как find_first_not_of Конрада, более эффективными и удобными.

* Спасибо Стиву за комментарии по поводу пространства на некоторых платформах со строковым содержимым, отличным от ASCII ... например http://msdn.microsoft.com/en-us/library/ms245348.aspx.

2 голосов
/ 27 апреля 2011

Если вы хотите знать, имеет ли определенный символ в строке определенное значение, и вы хотите знать, что для всех символов в строке вам нужно для перебора строки.Обойти это невозможно.Даже memcmp зацикливается на строке, она просто скрыта от вас.
Редактировать: Хотя я бы предоставил простую реализацию для строк переменной длины:

bool is_only_space(const char* str){
  while(*str != '\0'){
    if(*str != ' ')
      return false;
    ++str;
  }
  return true;
}

Конечно, это работает только для строк с нулевым символом в конце, но это должно быть задано.

...