Как убедиться, что строка заполнена пробелами для заданной длины?

У меня есть куча строк, которые мне нужно проверить, есть ли в них все пробелы.

Я могу сделать strlen(trim(strct.data)) > 0.

Но он не заканчивается нулем, но длина известна.

т. е. если strct.len равно 5, мне нужно проверить, есть ли в strct.data пробелы для 5 символов. 6-й символ не обязательно будет нулевым. У меня есть массив из strct, каждый из которых может иметь разную длину данных для проверки пробелов.

Я попробовал strnlen(trim(strct.data)) и позже понял, что это ничего не исправило, так как обрезка уже удалила все пробелы.

Любые идеи, кроме очевидного перебора каждого символа strct.data (мой последний вариант, если нет другого выхода)?

примечание: обрезка — это определяемая пользователем функция, которую я использую для удаления начальных и конечных пробелов. Это не останавливается до NULL тоже. Я ищу способ справиться с обоими.


person San    schedule 22.10.2013    source источник
comment
Как trim() узнает, когда остановиться, если data не NUL завершен?   -  person jxh    schedule 22.10.2013
comment
Есть ли причина, по которой вы не используете строки, заканчивающиеся NULL? Без этого вам нужен собственный код для обработки любых строковых операций и передачи всей структуры или строки и длины.   -  person crashmstr    schedule 22.10.2013
comment
Разве вы не можете изменить обрезку, чтобы вернуть количество удаленных пробелов? Триму все равно приходится ходить по струне.   -  person Henno    schedule 22.10.2013
comment
@crashmstr У меня нет контроля над этой частью. Я получаю только структуру для проверки.   -  person San    schedule 22.10.2013
comment
@Henno, он будет продолжать идти, и 6-й символ тоже может быть пробелом .. :(   -  person San    schedule 22.10.2013
comment
@San Итак, ваша пользовательская отделка не учитывает длину вашей строки?!? Я не понимаю.   -  person Henno    schedule 22.10.2013
comment
@Henno, который тоже является частью существующего.   -  person San    schedule 22.10.2013


Ответы (3)


Как убедиться, что строка заполнена пробелами для заданной длины?

шаг 1:

  char buf[MAX_SIZE];
  sprintf(buf,"%*s",MAX_SIZE-1,"");  //fill buffer with spaces

шаг 2:

Теперь используйте strncmp(), сравните количество символов strct.len массива символов strct.data с buf.

if(strncmp(strct.data ,buf ,strct.len) ==0)
  {
   //all are spaces
  }  

Вам не нужно повторять шаг 1.


Другое решение jxh предложило вам также использовать memset() вместо sprintf()

  memset(buf, ' ', sizeof buf); //fill buf with all spaces 

Вам нужно сделать это один раз, в следующий раз вам не нужно этого делать.


Вы также можете использовать VLA.

объявление char buf[strct.len];

но вам нужно использовать memset каждый раз.

person Gangadhar    schedule 22.10.2013
comment
Вы можете использовать memset() для буфера, и вы можете использовать VLA для выполнения char buf[strct.len] и использовать memcmp(). - person jxh; 22.10.2013

Вероятно, лучше всего делать цикл самостоятельно:

for(int i=0; i<strct.len; ++i) {
  if(strct[i] != ' ') {
    return false;
  }
}
return true;
person Henno    schedule 22.10.2013
comment
Как я уже сказал, это тот, который я бы выбрал, если нет другого лучшего пути. - person San; 22.10.2013
comment
В любом случае ваша обрезка должна перебирать строку. Возможно, у вас уже есть нужный номер. - person Henno; 22.10.2013
comment
Это должно работать, если новая функция, которая занимается обрезкой с помощью strct.len. Как вы предположили, у него уже будет номер. - person San; 22.10.2013

Поскольку массив символов не завершается нулем, он не является строкой.
Но давайте не будем придираться к этому вопросу и создадим быструю процедуру для больших массивов.

IsCharArrayAllSpace(const char *p, size_t Length) {
  if (Length < 1) return 1;  // TBD: decide how to handle the zero-length case
  return (p[0] == ' ') && (memcmp(p, &p[1], Length-1) == 0);
}
person chux - Reinstate Monica    schedule 22.10.2013