Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dimp
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 18
#1

Длина массива - C++

26.06.2013, 12:59. Просмотров 1069. Ответов 8
Метки нет (Все метки)

Создал свой класс строка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class mstring
{
private:
    char *pSt;
    int len;
public:
    mstring();
    mstring(string);
    mstring(char *);
    mstring(int);
    mstring(const char);
    mstring(const mstring &);
    ~mstring();
//...
};
Если нужны будут определения функций, выложу.
Вопрос в следующем можно ли при вызове конструктора mstring(char *) узнать длинну массива. То есть:
C++
1
2
3
4
5
6
7
8
9
int main()
{
    char *t=new char[5];
    char q[4];
    mstring a(t),b(q);
 
 
    return 0;
}
при вызове a(t) и b(q) знать, что длина t равна 5, а длина q 4. (функция strlen() выдает неверный результат, так как ни один из массивов не заканчивается нулевым символом)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2013, 12:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Длина массива (C++):

Длина массива - C++
Подскажите пожалуйста, как вывести на экран количество элементов в массиве, делаю так, а выводит мягко говоря не то что надо: #include...

длина массива - C++
напишите пожалуйста программу которая бы выполняла ввод 10 значений в массив и дальнейший расчот длины этого массива.. очень надо..

Длина пустого массива - C++
Я создал пустой двумерный динамический массив, но когда нахожу его длину, мне пишет что она равна 1. Видимо я что-то не так делаю. Как...

Инициализация массива. Длина строки - C++
Ребят, добрый день. Ломаю голову и не могу сообразить, как в массив занести не констант. строчку? Ну т.е не константой, например: mas...

Длина short[] - Почему размер массива внутри make отличается? - C++
Доброе время суток, господа. #include <iostream> #include <vector> #include <algorithm> using namespace std; template...

Заменить каждую серию, длина которой больше k, на один наименьший элемент массива - C++
3. Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.06.2013, 13:19 #2
C++
1
2
3
4
5
6
7
String::String(const char *s)
{
    lenght = strlen(s);
    sPtr = new char[lenght + 1];
    assert(sPtr != 0);
    strcpy(sPtr, s);
}
Добавлено через 2 минуты
Цитата Сообщение от Dimp Посмотреть сообщение
(функция strlen() выдает неверный результат, так как ни один из массивов не заканчивается нулевым символом)
Эта функция возвращает длину игнорируя символ окончания строки, поэтому длина будет strlen() + 1

Добавлено через 6 минут
C++
1
2
3
char *t=new char[5];
    char q[4];
    mstring a(t),b(q);
А зачем это? Вы создаете объекты с пустыми массивами. Но при этом у Вас есть конструктор для таких случаев.
C++
1
2
mstring();
mstring(int);
То есть в мейне должно быть:
C++
1
2
mstring a; // вызывает конструктор mstring();
mstring b(4);  // вызывает конструктор mstring(int);
Добавлено через 1 минуту
Или при вызове конструктора преобразования
C++
1
mstring(char *);
Вам нужно инициализировать Ваши массивы.
1
Dimp
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 18
26.06.2013, 13:29  [ТС] #3
C++
1
2
3
4
5
6
7
8
9
int main()
{
    char *t=new char[5];
    char q[5];
    for(int i=0;i<5;i++)
        t[i]=q[i]='a'+i;
    cout<<strlen(t)<<' '<<strlen(q)<<endl;
    return 0;
}
Я их не инициализировал, чтобы просто сообщение было покороче. Вот теперь инициализировал, но
Я вас не совсем понял. Код написанный выше выводит "22 19",а не "5 5".
0
Croessmah
Эксперт CЭксперт С++
13231 / 7503 / 846
Регистрация: 27.09.2012
Сообщений: 18,428
Записей в блоге: 3
Завершенные тесты: 1
26.06.2013, 13:30 #4
Цитата Сообщение от Dimp Посмотреть сообщение
Я вас не совсем понял. Код написанный выше выводит "22 19",а не "5 5".
потому что нет терминирующего нуля в конце
1
Dimp
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 18
26.06.2013, 13:36  [ТС] #5
Так вот в этом и вопрос, как узнать длинну массива, если в конце нет нулевого символа. Ведь когда мы их задаем, я четко пишу 5 и, мне кажется, где-то в памяти должен быть зафиксирован факт, что длина массивов q и t равна именно 5.
0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.06.2013, 13:40 #6
То, что вы делаете вот тут:
C++
1
2
3
4
5
6
7
8
9
int main()
{
    char *t=new char[5];
    char q[5];
    for(int i=0;i<5;i++)
        t[i]=q[i]='a'+i;
    cout<<strlen(t)<<' '<<strlen(q)<<endl;
    return 0;
}
инициализирует массив символов. Строка должна заканчиваться '\0'
C++
1
2
3
4
5
6
7
8
char *t=new char[5];
    char q[5];
    for(int i=0;i<5;i++)
        t[i]=q[i]='a';
    t[4] = q[4] = '\0';
    cout<<strlen(t)<<' '<<strlen(q)<<endl;
    cout << t << endl;
    delete [] t;
или как вариант для инициализации использовать cin.getline(t, 4);
1
Croessmah
Эксперт CЭксперт С++
13231 / 7503 / 846
Регистрация: 27.09.2012
Сообщений: 18,428
Записей в блоге: 3
Завершенные тесты: 1
26.06.2013, 13:44 #7
Цитата Сообщение от Dimp Посмотреть сообщение
в памяти должен быть зафиксирован факт, что длина массивов q и t равна именно 5.
Где и как что храниться зависит от платформы, так что в плюсах нет встроенных средств для этого.
Однако, для массивов(именно для массивов, а не для указателей на первый элемент)
C++
1
char q[5];
можно использовать sizeof
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
26.06.2013, 13:49 #8
Цитата Сообщение от Dimp Посмотреть сообщение
* * mstring(string);
* * mstring(char *);
* * mstring(int);
* * mstring(const char);
Вот так должно быть
C++
1
2
3
4
mstring(const string&);
mstring(const char*);
explicit mstring(int);
explicit mstring(char);
И не опускайте имена параметров функций в интерфейсе класса.
Цитата Сообщение от Dimp Посмотреть сообщение
Вопрос в следующем можно ли при вызове конструктора mstring(char *) узнать длинну массива.
Eсли строка не заканчивается '\0', узнать длину строки не удастся. В данном случае можно сделать два конструктора: один вида mstring(const char* str); для строк заканчивающихся '\0', и второй [I]mstring(const char* arr, int n), где n - количество элементов в массиве.
Цитата Сообщение от Мимино Посмотреть сообщение
sPtr = new char[lenght + 1];
* * assert(sPtr != 0);
new по умолчанию генерирует исключение, а не возрващает 0. К тому же assert, это не то средство которым нужно отлавливать такую вещь, как нехватка памяти.
1
Dimp
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 18
26.06.2013, 13:52  [ТС] #9
Тогда последний вопрос. А если задача состоит в том, что нужно еще и проверить, является ли данный набор символов строкой(с нулевым символом в конце) (во время выполнения конструктора)?
Получается даже на массив длинной 5, в котором нет нулевого символа (в первых 5ти символах), но есть нулевой символ где-то за массивом, мы дадим положительный ответ и нам это никак не обойти?
Пока писал, уже ответили
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2013, 13:52
Привет! Вот еще темы с ответами:

Заменить каждую серию массива, длина которой равна L, на один элемент с нулевым значением - C++
нужно решение Дано целое число L (&gt;0) и целочисленный массив размера N. Заме- нить каждую серию массива, длина которой равна L, на...

Заменить каждую серию массива, длина которой равна L, на один элемент с нулевым значением - C++
Здравствуйте.Дано целое число L (&gt; 0) и целочисленный массив размера N. Заменить каждую серию массива, длина которой равна L, на один...

появилась загвоздка с функцией. нужно вывести на экран строку, сост. из звездочек. Длина строки-параметр функциииз звезд. длина строки - - C++
Я видела, что на форуме есть подобные задачи, но ни одно из их решений не работает на моем dev cpp.:( вот вариант решения, но он не...

Превратить массив целых чисел размерности N, удалив из массива все серии, длина которых больше k - C++
Помогите плиз Превратить массив целых чисел размерности N, удалив из массива все серии, длина которых больше k. Вроде написала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.06.2013, 13:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru