strlen () для строки символов с нулевым завершением?

Является ли strlen(const char *s) определенным, когда s не завершено нулем, и если да, то что он возвращает?

Нет, это не определено. Это может привести к нарушению доступа к памяти, поскольку оно будет продолжать подсчет до тех пор, пока не достигнет первого байта памяти, значение которого равно 0.

Из стандарта C99:

Функция strlen возвращает количество символов, предшествующих завершающему нулевому символу.

Если нет нулевого символа, это означает, что результат не определен.

Может быть, вам нужно strnlen ?

Не совсем, и это вызовет плохие вещи .

Если ваша строка не завершена NUL, функция будет продолжать искать, пока не найдет ее.

Если вам повезет, это приведет к сбою вашей программы.

Если вам не повезет, вы получите большую, чем ожидалось, длину, с множеством «неожиданных» значений.

Он вернет количество встреченных символов до того, как будет найден «\ 0».

Он не определен. Это приводит к неопределенному поведению, что означает, что что-то может произойти, скорее всего, ваша программа выйдет из строя.

strlen () работает только (делает что-то полезное) в нулевых строках; вы получите совершенно неопределенный результат, если вы передадите что-либо иное. Если вам повезет, это не вызовет крушения 🙂

man 3 strcspn

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

Длина строк, разделенных двоеточиями:

 size_t len = strcspn(str, ":"); 

Длина строк с разделителями-запятыми:

 size_t len = strcspn(str, ","); 

Длина строк с разделителями табуляции:

 size_t len = strcspn(str, "\t"); 

Он всегда определен.

Он вернет длину «строки», пока не достигнет байта с нулевым значением в нем. Плохая идея, потому что это может вызвать переполнение буфера.

  • Почему мой оператор мощности (^) не работает?
  • Является ли модификация строковых литералов неопределенным поведением в соответствии со стандартом C89?
  • Возвращаемое значение функции printf () в C
  • возвращает указатель на литеральный (или постоянный) массив символов (строка)?
  • Как представить номер FLOAT в памяти на C
  • Почему разделение двух целых чисел не дает поплавка?
  • Функция, возвращающая адрес локальной переменной ошибки в C
  • Разница между объявленной строкой и выделенной строкой
  • интеграция пружин + cron + кварц в кластере?
  • Возrotation строки C из функции
  • Разделить строку на C в каждом пробеле
  • Давайте будем гением компьютера.