Используйте strlen со scanf(%ms)

Можно ли использовать strlen() для динамически выделяемой строки?

НАПРИМЕР:

#include <stdio.h>
#include <string.h>

int main ()
{
  char *input=NULL;
  printf ("Enter a sentence: ");
  scanf("%ms", &input);
  //Is this legit?
  printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(input));
  return 0;
}

person Mattia Surricchio    schedule 05.08.2018    source источник
comment
Будет ли строка правильно завершена? Тогда да, вы можете использовать любые строковые функции. И помните, что формат "%ms" является нестандартным (и, следовательно, непереносимым) расширением.   -  person Some programmer dude    schedule 05.08.2018
comment
@Someprogrammerdude Да, строка всегда правильно завершается, я все равно не беспокоюсь о переносимости   -  person Mattia Surricchio    schedule 05.08.2018
comment
Просто чтобы вы знали, даже если вы не делаете переносимые вещи для текущей программы, изучение непереносимых функций приводит к плохим привычкам, которые могут прийти и укусить вас сзади, когда вы должны использовать другой компилятор или писать переносимым.   -  person Some programmer dude    schedule 05.08.2018
comment
@Someprogrammerdude Спасибо за совет! Я знаю об этом, но я работаю над школьным проектом, который не так хорошо организован. Они почти заставляют нас писать ужасный код...   -  person Mattia Surricchio    schedule 05.08.2018
comment
Примечание. Вы можете избежать приведения и использовать %zu, если используете C99+.   -  person Spikatrix    schedule 05.08.2018
comment
@someprogrammerdude: модификатор m определяется Posix, что определенно стандарт. Или вы говорите, что функции Posix никогда не должны использоваться? Если да, то как вы предлагаете подходить к сокетам? :-)   -  person rici    schedule 05.08.2018
comment
@rici Определяется стандартом a, не определяется стандартом the: стандарт C. И поэтому он непереносим и является расширением языка C. :) То же самое и с сокетами, просто так получилось, что большинство других платформ эмулируют части API сокетов POSIX.   -  person Some programmer dude    schedule 05.08.2018


Ответы (1)


Вы можете использовать strlen() в любой последовательности char, заканчивающейся '\0' , нулевым символом, также известным как NUL*1, что на самом деле равно 0.

Неважно, как была выделена память.

Так что да, это также относится к "динамически выделяемой" памяти.


*1: не путать с NULL, константой нулевого указателя.

person alk    schedule 05.08.2018
comment
Это действительно также для strcpy? - person Mattia Surricchio; 05.08.2018
comment
@MattiaSurricchio: Да, эти правила применяются ко всем членам str*()-семейства функций. - person alk; 05.08.2018
comment
Разве вы не имели в виду символ NUL? - person Deduplicator; 05.08.2018
comment
@Deduplicator: нет. Нулевой символ и NUL-символ — это одно и то же. - person alk; 05.08.2018
comment
@Deduplicator: Итак, чтобы ответить на ваш вопрос более точно: нет и да. ;-) - person alk; 05.08.2018