Как узнать длину динамического или неопределенного массива типа char

Рейтинг: 0Ответов: 2Опубликовано: 04.04.2015

Много всего перерыл в интернете, но толкового ответа не нашлось.

Знаю что есть sizeof(), который узнает длину статического массива в байтах, но с динамикой это не подходит.

Кто знает, подскажите.

Например, в этом коде:

char a[] = "";
std::cin >> getline(a, тут_надо_размер);
std::cout << a;

Получается несостыковка: размер мы не знаем, но если я введу фразу "Hello World", как узнать на этапе обработки сколько мне нужно байт?

Ответы

▲ 3Принят

А не будет оно работать. Так по стандарту. Нужен размер - сохраняйте в отдельной переменной размер. В случае обычных строк в самый конец добавляют ноль, поэтому функции вида strlen и могут получить размер, сканируя строку на наличние нужного символа.

В целом, есть всякие обходные пути "доставания размера", но они сильно зависят от конкретной версии компилятора и даже его настроек. Обычно ими пользуются отладчики.

Пример, который Вы привели, обычно пишут так

#define SIZE 250
std::char a[SIZE];
std::cin.getline(a, SIZE);
std::cout << a;

Но в С++ эту проблему решили - там есть класс std::vector. Используйте его там, где хотите "динамические массивы".

▲ 2

Если вы инициализируете так char a[] = "test"; то размер массива можно определить так:

sizeof(a)

если же так:

char *a = "test";

то у вас по сути нет массива, а всего лишь указатель на строковую константу.