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

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

Восстановить пароль Регистрация
 
Dimp
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 18
26.06.2013, 12:59     Длина массива #1
Создал свой класс строка
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() выдает неверный результат, так как ни один из массивов не заканчивается нулевым символом)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мимино
 Аватар для Мимино
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 *);
Вам нужно инициализировать Ваши массивы.
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".
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
26.06.2013, 13:30     Длина массива #4
Цитата Сообщение от Dimp Посмотреть сообщение
Я вас не совсем понял. Код написанный выше выводит "22 19",а не "5 5".
потому что нет терминирующего нуля в конце
Dimp
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 18
26.06.2013, 13:36  [ТС]     Длина массива #5
Так вот в этом и вопрос, как узнать длинну массива, если в конце нет нулевого символа. Ведь когда мы их задаем, я четко пишу 5 и, мне кажется, где-то в памяти должен быть зафиксирован факт, что длина массивов q и t равна именно 5.
Мимино
 Аватар для Мимино
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);
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
26.06.2013, 13:44     Длина массива #7
Цитата Сообщение от Dimp Посмотреть сообщение
в памяти должен быть зафиксирован факт, что длина массивов q и t равна именно 5.
Где и как что храниться зависит от платформы, так что в плюсах нет встроенных средств для этого.
Однако, для массивов(именно для массивов, а не для указателей на первый элемент)
C++
1
char q[5];
можно использовать sizeof
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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, это не то средство которым нужно отлавливать такую вещь, как нехватка памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2013, 13:52     Длина массива
Еще ссылки по теме:

Заменить каждую серию массива, длина которой равна L, на один элемент с нулевым значением C++
C++ Заменить каждую серию, длина которой больше k, на один наименьший элемент массива
Длина short[] - Почему размер массива внутри make отличается? C++

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

Или воспользуйтесь поиском по форуму:
Dimp
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 18
26.06.2013, 13:52  [ТС]     Длина массива #9
Тогда последний вопрос. А если задача состоит в том, что нужно еще и проверить, является ли данный набор символов строкой(с нулевым символом в конце) (во время выполнения конструктора)?
Получается даже на массив длинной 5, в котором нет нулевого символа (в первых 5ти символах), но есть нулевой символ где-то за массивом, мы дадим положительный ответ и нам это никак не обойти?
Пока писал, уже ответили
Yandex
Объявления
26.06.2013, 13:52     Длина массива
Ответ Создать тему
Опции темы

Текущее время: 08:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru