Определение, состоит ли строка только из пробелов?

#c #string

#c #строка

Вопрос:

Какой самый эффективный / безопасный способ проверить, состоит ли строка в C только из пробелов? Нужно ли мне самому написать функцию для проверки или она есть в string.h, который я могу использовать?

Комментарии:

1. остерегайтесь is функций *: они требуют преобразования своего аргумента в unsigned char . Смотрите 7.4 / 1 в стандарте C99 .

Ответ №1:

Ну, написать свой собственный — это тривиально:

 int IsSpaces( char * s ) {

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

Все, что вы используете из стандартной библиотеки, вряд ли будет намного эффективнее.

Комментарии:

1. Без обид, неперсон, но я нахожу ваш стиль кодирования очень трудным для чтения.

2. @night Извините за это, на самом деле это разрабатывалось годами обучения людей C и C , чтобы быть настолько ясным, насколько я могу это сделать.

3. Единственная часть, которая кажется мне трудной для чтения, — это пробел вокруг содержимого круглых скобок. Я не уверен, как это облегчает чтение; похоже, это разделяет вещи, которые логически сочетаются.

4. Мне трудно это понять, но я уважаю это, поскольку мне всего 16, а стиль кодирования очень личный. Но я приведу некоторые пояснения к тому, что меня раздражает: слишком большой интервал в скобках, непоследовательный интервал между while( и if ( , оператор разыменования, отделенный от операнда (вы тоже не пишете — 5, когда имеете в виду -5, верно?), перевод строки после открывающей скобки функции и один оператор, заключенный в квадратные скобки с отступом ( return 0; ). С другой стороны, мой стиль кодирования очень лаконичен, что тоже может быть сложно для чтения.

5. приведите аргумент isspace, чтобы избежать UB: isspace((unsigned char)*s) .

Ответ №2:

Попробуйте это:

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

Если вы хотите также включить табуляции, новые строки и т.д. в вашем определении «пробелов» просто добавьте их ко второму аргументу strspn .

Комментарии:

1. Ваша строка кода изящна, очень умна и очень сложна для понимания (особенно до того, как я исправил вашу синтаксическую ошибку ;))

2. Хорошо, более эффективно, чем strspn () == strlen(). Возможно, стоит отметить, что вы будете индексировать конечный байт 0, если интервал равен всей длине, таким образом ! ‘ 0’ будет иметь значение true.

Ответ №3:

man string.h привело меня к следующей справочной странице.

НАЗОВИТЕ strspn, strcspn — поиск в строке набора символов

КРАТКИЙ ОБЗОР

    #include <string.h>

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

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

Описание

  • Функция strspn() вычисляет длину начального сегмента s, который полностью состоит из символов accept.

  • Функция strcspn() вычисляет длину начального сегмента s, который полностью состоит из символов, не включенных в reject.

Ответ №4:

Когда вы говорите пробел, вы имеете в виду именно или символ пробела?

Однако такой функции нет, хотя это работает:

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

Если вы имеете в виду символы-интервалы вместо буквенного пробела, эта версия подходит:

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

Комментарии:

1. приведите аргумент isspace, чтобы избежать UB: isspace((unsigned char)*str ) .

2. @pmg: AFAIK isspace определяется как принимающий значение int, поэтому никаких проблем не возникнет.

3. Вы уверены, что char она без знака? ... char *buf = "José Peña";

4. Разве последняя строка не должна быть return --str == '' ?