getline проверяет, является ли строка пробелом - PullRequest
7 голосов
/ 20 октября 2010

Есть ли простой способ проверить, пуста ли строка.Поэтому я хочу проверить, содержит ли он пробелы, такие как \ r \ n \ t и пробелы.

Спасибо

Ответы [ 7 ]

20 голосов
/ 20 октября 2010

Вы можете использовать функцию isspace в цикле, чтобы проверить, все ли символы являются пробелами:

int is_empty(const char *s) {
  while (*s != '\0') {
    if (!isspace((unsigned char)*s))
      return 0;
    s++;
  }
  return 1;
}

Эта функция вернет 0, если любой символ не является пробелом (т.е.строка не пустая) или 1 в противном случае.

3 голосов
/ 20 октября 2010

Если строка s состоит только из символов пробела, то strspn(s, " \r\n\t") вернет длину строки.Поэтому простой способ проверить это strspn(s, " \r\n\t") == strlen(s), но это дважды обойдет строку.Вы также можете написать простую функцию, которая будет проходить по строке только один раз:

bool isempty(const char *s)
{
  while (*s) {
    if (!isspace(*s))
      return false;
    s++;
  }
  return true;
}
1 голос
/ 21 октября 2010

Я не буду проверять '\ 0', поскольку '\ 0' не является пробелом, и цикл на этом заканчивается.

int is_empty(const char *s) {
  while ( isspace( (unsigned char)*s) )
          s++;
  return *s == '\0' ? 1 : 0;
}
0 голосов
/ 08 сентября 2016

Для C ++ 11 вы можете проверить, является ли строка пробелом, используя std::all_of и isspace (isspace проверяет пробелы, табуляции, новую строку, вертикальную табуляцию, подачуи возврат каретки:

std::string str = "     ";
std::all_of(str.begin(), str.end(), isspace); //this returns true in this case

, если вы действительно хотите проверить только пространство символов, то:

std::all_of(str.begin(), str.end(), [](const char& c) { return c == ' '; });
0 голосов
/ 16 июля 2015

Мое предложение будет:

int is_empty(const char *s)
{
    while ( isspace(*s) && s++ );
    return !*s;
}

с рабочим примером .

  1. Зацикливание символов строкии останавливается, когда
    • был найден непробельный символ,
    • или nul символ был посещен.
  2. Если указатель строки остановился, проверьтеесли строка содержит нулевой символ.

В зависимости от сложности, он линейен с O (n), где n - размер входной строки.

0 голосов
/ 20 октября 2010

Рассмотрим следующий пример:

#include <iostream>
#include <ctype.h>

bool is_blank(const char* c)
{
    while (*c)
    {
       if (!isspace(*c))
           return false;
       c++;
    }
    return false;
}

int main ()
{
  char name[256];

  std::cout << "Enter your name: ";
  std::cin.getline (name,256);
  if (is_blank(name))
       std::cout << "No name was given." << std:.endl;


  return 0;
}
0 голосов
/ 20 октября 2010

Учитывая char *x=" ";, вот что я могу предложить:

bool onlyspaces = true;
for(char *y = x; *y != '\0'; ++y)
{
    if(*y != '\n') if(*y != '\t') if(*y != '\r') if(*y != ' ') { onlyspaces = false; break; }
}
...