¿Detectar si una cadena solo está formada por espacios?

¿Cuál es la forma más eficiente / segura de verificar si una cadena en C está formada solo por espacios? ¿Necesito escribir una función yo mismo para verificar o hay una en string.h que pueda usar?

preguntado el 10 de mayo de 11 a las 13:05

cuidado con el is* funciones: ellos exigir su argumento se convierta en unsigned char. Ver 7.4 / 1 en el estándar C99. -

4 Respuestas

Bueno, escribir el tuyo es trivial:

int IsSpaces( char * s ) {

    while ( * s ) {
        if ( ! isspace( * s ) ) {
            return 0;
        }
        s++;
    }
    return 1;
}

No es probable que todo lo que use de la biblioteca estándar sea mucho más eficiente.

contestado el 10 de mayo de 11 a las 23:05

No te ofendas, pero encuentro tu estilo de codificación muy difícil de leer. - orlp

@night Lo siento, en realidad se ha desarrollado durante años de enseñar a la gente C y C ++ para que sea lo más claro posible. - usuario2100815

La única parte que me parece difícil de leer es el espacio alrededor del contenido entre paréntesis. No estoy seguro como eso lo hace más fácil leer; parece estar dividiendo cosas que lógicamente van juntas. - Cody Grey ♦

Es difícil para mí entender eso, pero lo respeto ya que solo tengo 16 años y el estilo de codificación es muy personal. Pero daré una copia de seguridad de lo que encuentro molesto: demasiado espacio entre corchetes, espaciado inconsistente entre while( y if (, operador de desreferencia espaciado del operando (tampoco escribe - 5 cuando quiere decir -5 ¿verdad?), una nueva línea después del corchete de la función de apertura y una sola declaración entre corchetes y sangría (el return 0;). Por otro lado, mi estilo de codificación es muy conciso, lo que también puede resultar difícil de leer. - orlp

lanzar el argumento isspace para evitar UB: isspace((unsigned char)*s). - pmg

Prueba esto:

if (!s[strspn(s, " ")]) /* it's all spaces */

Si también desea incluir tabulaciones, nuevas líneas, etc. en su definición de "espacios", simplemente agréguelos al segundo argumento de strspn.

contestado el 10 de mayo de 11 a las 17:05

Su línea de código es ingeniosa, muy inteligente y muy difícil de entender (especialmente antes de que arreglara su error de sintaxis;)) - ypnos

De acuerdo, más eficiente que strspn () == strlen (). Podría valer la pena comentar que indexará el \ 0 byte final IFF, el intervalo es la longitud completa, por lo que el! '\ 0' será verdadero. - Roboprog

man string.h me llevó a la siguiente página de manual.

NAME strspn, strcspn: busca una cadena para un conjunto de caracteres

SINOPSIS

   #include <string.h>

   size_t strspn(const char *s, const char *accept);

   size_t strcspn(const char *s, const char *reject);

DESCRIPCIÓN

  • La función strspn () calcula la longitud del segmento inicial de s que consta completamente de caracteres en accept.

  • La función strcspn () calcula la longitud del segmento inicial de s que consta completamente de caracteres que no están en rechazo.

contestado el 10 de mayo de 11 a las 17:05

Cuando dices espacio, ¿te refieres exactamente o un carácter de espaciado?

Sin embargo, no existe tal función, aunque esto funciona:

int isonlyspaces(char *str) {
    while (*str++ == ' ');
    return --str == '\0';
}

Si te refieres a espaciar caracteres en lugar de un espacio literal, esta versión es apropiada:

int isonlyspaces(char *str) {
    while (isspace(*str++));
    return --str == '\0';
}

contestado el 10 de mayo de 11 a las 17:05

lanzar el argumento isspace para evitar UB: isspace((unsigned char)*str++). - pmg

@pmg: AFAIK isspace está definido para tomar un int para que no haya ningún problema. - orlp

Estás seguro char está sin firmar? ... char *buf = "José Peña"; - pmg

No debería ser la última línea return --str == '\0'? - Ishtar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.