#cpp
// TestLesson.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include#include using namespace std; int main() { setlocale(LC_ALL, "rus"); int* size = new int; cin >> *size; cout << "Элементы массива: | "; char* arrayChar = new char[*size]; for (int k = 0; k < *size; k++) { arrayChar[k] = 'a' + k; cout << arrayChar[k] << " | "; } cout << endl; cout << strlen(arrayChar); system("pause>nul"); return 0; } Почему метод srtlen() выводит отве больше, чем реально заданных (заданных при объявлении)? И при чем не имеер значение какой массив: статический или динамический. Я использую Microsoft Visual Studio 2017
Ответы
Ответ 1
Функция strlen предназначена для определения длин С-строк. Аргументом функции strlen может быть только указатель на начало С-строки. В противном случае поведение не определено. С-строкой называется последовательность символов типа char, завершающаяся символом '\0'. У вас в коде эти требования соблюдены? Нет. Поэтому применение функции strlen в вашем коде вызывает неопределенное поведение. Что вы и наблюдаете. К "определению количества элементов массива", упомянутому в заголовке вашего вопроса, функция strlen никакого отношения не имеет. Более того, в С++ нет встроенных средств для определению количества элементов массива, выделенного через new []. В вашем коде вы и так знаете размер вашего массива - это *size. Тщательно берегите этот размер и пользуйтесь им везде, где он вам нужен. Разумеется, вместо "голого" массива вы можете воспользоваться std::vector, который будем сам хранить этот размер для вас.Ответ 2
Зачем усложняете себе "жизнь"? Можно проще int size = 0; cin >> size; // cout << "Элементы массива: | "; char* arrayChar = new char[size + 1]; // не size, а на 1 больше for (int k = 0; k < size; k++) { arrayChar[k] = 'a' + k; cout << arrayChar[k] << " | "; } cout << endl << size; // это и есть количество элементов
Комментариев нет:
Отправить комментарий