2010-10-20 14 views
6

¿Existe alguna manera fácil de verificar si una línea está vacía? Por lo tanto, quiero verificar si contiene algún espacio en blanco como \ r \ n \ t y espacios.getline compruebe si la línea es un espacio en blanco

Gracias

+0

Pero isspace() valor devuelto depende de la configuración regional c instalado y lo que dependiendo de que pueda volver falsa de nueva línea o caracteres de tabulación – Suba

Respuesta

15

Usted puede utilizar la función isspace en un bucle para comprobar si todos los caracteres son los espacios en blanco:

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

Esta función devolverá 0 si cualquier carácter no es un espacio en blanco (es decir, la línea no está vacía), o 1 en caso contrario.

+2

el argumento de 'isspace'. debería ser lanzado a 'char sin signo (la función de * es "no me gusta" y 'char 'puede estar firmada):' isspace ((unsigned char) * s) ' – pmg

+0

que funcionará. ¡Gracias! – Matt

0

Dado un char *x=" "; esto es lo que puedo sugerir:

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

Si una cadena s consiste solo en espacios en blanco, entonces strspn(s, " \r\n\t") devolverá la longitud de la cadena. Por lo tanto, una forma simple de verificar es strspn(s, " \r\n\t") == strlen(s), pero esto atravesará la cadena dos veces. También puede escribir una función simple que atravesaría en la cadena de una sola vez:

bool isempty(const char *s) 
{ 
    while (*s) { 
    if (!isspace(*s)) 
     return false; 
    s++; 
    } 
    return true; 
} 
0

Considere el siguiente ejemplo:

#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; 
} 
+1

'str',' * c', 'c' ¿cuál es?:-) – pmg

+0

@pmg: Solo 'str' es incorrecto. '* c' es el valor de' c', ¡así que está bien! ¡Pero gracias! – Rizo

1

No voy a comprobar si hay '\ 0' desde '\ 0' no es espacio y el ciclo terminará allí.

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

Mi sugerencia sería:

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

con un working example.

  1. bucles sobre los caracteres de la cadena y se detiene cuando
    • o bien se encontró un carácter no-espacio,
    • o nulo carácter fue visitado.
  2. Donde el puntero de cadena se ha detenido, compruebe si el contenido de la cadena es el carácter nul.

En materia de complejidad, es lineal con O (n), donde n es el tamaño de la cadena de entrada.

0

para C++ 11 se puede comprobar es una cadena es un espacio en blanco usando std::all_of y isspace (cheques isspace de espacios, tabulaciones, salto de línea, tabulador vertical, alimentación y retorno de carro:

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

si realmente sólo quería comprobar si el espacio de carácter a continuación:.

std::all_of(str.begin(), str.end(), [](const char& c) { return c == ' '; }); 
Cuestiones relacionadas