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

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

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

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

26.06.2013, 12:59. Просмотров 1010. Ответов 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() выдает неверный результат, так как ни один из массивов не заканчивается нулевым символом)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2013, 12:59     Длина массива
Посмотрите здесь:

длина массива C++
Длина файла C++
C++ Длина Ломаной
Длина массива C++
задан текст. удалить из нее все слова, длина которых четная (создать новый массив, оставив все слова, длина которых нечетная) C++
C++ функция (длина)
появилась загвоздка с функцией. нужно вывести на экран строку, сост. из звездочек. Длина строки-параметр функциииз звезд. длина строки - C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мимино
 Аватар для Мимино
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
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12512 / 7074 / 794
Регистрация: 27.09.2012
Сообщений: 17,467
Записей в блоге: 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
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12512 / 7074 / 794
Регистрация: 27.09.2012
Сообщений: 17,467
Записей в блоге: 2
Завершенные тесты: 1
26.06.2013, 13:44     Длина массива #7
Цитата Сообщение от Dimp Посмотреть сообщение
в памяти должен быть зафиксирован факт, что длина массивов q и t равна именно 5.
Где и как что храниться зависит от платформы, так что в плюсах нет встроенных средств для этого.
Однако, для массивов(именно для массивов, а не для указателей на первый элемент)
C++
1
char q[5];
можно использовать sizeof
rangerx
1920 / 1529 / 139
Регистрация: 31.05.2009
Сообщений: 2,892
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     Длина массива
Еще ссылки по теме:

C++ Инициализация массива. Длина строки
C++ Превратить массив целых чисел размерности N, удалив из массива все серии, длина которых больше k
Заменить каждую серию массива, длина которой равна 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     Длина массива
Ответ Создать тему
Опции темы

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