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"); 

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

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

  • Что возвращает задание?
  • Добавление или вычитание цвета из изображения в pictureBox с использованием C #
  • Использование функции exit ()
  • Почему sizeof (param_array) - размер указателя?
  • Альтернативный (K & R) C синтаксис для объявления функции против прототипов
  • Переменные стека против переменных кучи
  • Есть ли функция для округления поплавка на C или мне нужно написать собственное?
  • Почему разделение двух целых чисел не дает поплавка?
  • Как обменяться между различными .c файлами?
  • Можно ли использовать несколько (двух) постоянных хранилищ с одной объектной моделью, поддерживая отношения друг от друга?
  • Почему мой оператор мощности (^) не работает?
  • Interesting Posts

    JUnit confusion: использовать ‘extends TestCase’ или ‘@Test’?

    Необычная проблема с printf в сценарии bash: «09» и «08» – недопустимые числа, «07» и «06» – штраф

    Как получить имя компьютера в .NET.

    Не удается установить Kali Linux с USB, не удается найти привод CD-ROM

    С HTTPS, являются ли URL и заголовки запросов защищенными как тело запроса?

    Любая опция для изменения имени Windows XP по умолчанию «Копировать здесь» из «Копия {name}. {Ext}" на "{name}. {Ext} .copy"

    Android Webview – полностью очистить кэш

    Абстрактный class vs Интерфейс в Java

    Отключение кнопки «Назад» в браузере

    @ViewScoped вызывает @PostConstruct при каждом запросе обратной передачи

    Установка рабочего каталога / диска по умолчанию в оболочке Emacs в Windows

    Бесплатное программное обеспечение для видеонаблюдения с использованием веб-камеры, работающей в Windows

    Почему в Chrome отображается журнал «Медленная сеть …»?

    Влияет ли мощность на источник питания на максимальную выходную мощность?

    Расширение файла для файлов Markdown?

    Давайте будем гением компьютера.