Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Ошибка в определении количество элементов массива в C++

#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; // это и есть количество элементов

Комментариев нет:

Отправить комментарий