#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 == ''
?