2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 69
1

Пишем свой strlen

14.03.2022, 00:20. Показов 1216. Ответов 27
Метки нет (Все метки)

Всем привет, вырвал часть задание из общего задание по написанию своего string.
На данном этапе столкнулся с проблемой (хотел написать свой strlen), но не знаю как реализовать нахождение мусора, могу через таблицу ASCII, но знаю вроде бы что, есть какая-то функция системная. кто подскажет?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int strlensv(const char* a)
    { 
        if (a == nullptr)
        {
            return 0;
        }
 
        int i = 0;
        while (a[i] != '\0') //как найти мусор
        {
            i++;
        }
        return i;
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2022, 00:20
Ответы с готовыми решениями:

Пишем свой чекер
Я хочу написать свой чекер, но не знаю с чего начать? Кто знает основные принцип работы чекеров...

пишем свой троян с нуля
Всем привет)))соглашусь, что изобретаю велосипед, но хочется сделать все своими ручками не прибегая...

Пишем свой интерпретатор языка BASIC
***************** Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку...

Пишем свой интерпретатор языка BASIC
Добрый день. Я смотрю, тут на форуме была тема коллективного написания интерпретатора BASIC на...

Пишем свой класс, спецификатор доступа protected
Всем привет! Из книги Р. Лафоре относительно спецификатора доступа protected: Далее пишется...

27
1311 / 946 / 335
Регистрация: 29.06.2020
Сообщений: 3,634
14.03.2022, 00:48 2
Цитата Сообщение от Xpystum Посмотреть сообщение
//как найти мусор
Открой мусорное ведро иль спроси у бомжа, на крайняк.

Добавлено через 57 секунд
Цитата Сообщение от Xpystum Посмотреть сообщение
вырвал часть задание из общего задание по написанию своего string
поздравляю, вот у тебя уже есть кусок мусора, даже искать не нужно.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 69
14.03.2022, 00:54  [ТС] 3
Спасибо за конструктивный ответ, может кто ещё подсказать без остроумных ответов?
про мусор я имел ввиду мусорные символы:
Миниатюры
Пишем свой strlen  
0
140 / 119 / 44
Регистрация: 09.03.2016
Сообщений: 1,019
14.03.2022, 00:59 4
Некоторые нультерминатор ищут.
Я не решаюсь. Всё равно обсерут.
0
1311 / 946 / 335
Регистрация: 29.06.2020
Сообщений: 3,634
14.03.2022, 01:04 5
Цитата Сообщение от Xpystum Посмотреть сообщение
конструктивный ответ
Если у тебя С-строка, признаком конца строки является символ '\0', его числовой код равен 0.
Если у тебя свой класс строки, стоит хранить размер строки отдельно, как это делает std::string.

По причинам написанных выше, мне не понятен ни вырванный кодмусор, ни ваш вопрос.

Добавлено через 46 секунд
Цитата Сообщение от Наталья8 Посмотреть сообщение
Некоторые нультерминатор ищут.
Я не решаюсь. Всё равно обсерут.
Если работать с С-строками, по другому никак.

Добавлено через 3 минуты
Xpystum, ну а к чему я хотел вас подтолкнуть, это к тому, что никакого "мусора" в ОЗУ нету.
Исходя из этого утверждения, должны были подумать, а что же есть ?
Но видимо вам все равно, что и как там есть. Вам же нужно мусор найти...
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 69
14.03.2022, 01:05  [ТС] 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class string
{
private:
 
    char* dyn;
    int LEN; //учитывать ли \0?
 
    int strlensv(const char* a)
    { //вернуть 0
        if (a == nullptr)
        {
            return 0;
        }
        int i = 0;
        while (a[i] != '\0') //как найти мусор
        {
            i++;
        }
        return i;
    }
*часть кода

я же написал что я в стринге пишу свой стрлён и мне его надо до ума довести что бы работать дальше с ним.
я не хочу использовать готовую функцию strlen();
0
1311 / 946 / 335
Регистрация: 29.06.2020
Сообщений: 3,634
14.03.2022, 01:11 7
Цитата Сообщение от Xpystum Посмотреть сообщение
//учитывать ли \0?
не учитывать,

Цитата Сообщение от Xpystum Посмотреть сообщение
я же написал что я в стринге пишу свой стрлён
Но зачем, у вас уже есть переменная для длинны строки.
Когда какой то метод изменяет ее, просто изменяете переменную LEN.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 69
14.03.2022, 01:13  [ТС] 8
Может когда-нибудь кому-нибудь понадобится решилось это условиям (int(a[i]) >= 0 && int(a[i]) <= 255 && a[i] != '\0')
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 int strlensv(const char* a)
    {
        if (a == nullptr)
        {
            return 0;
        }
        int i = 0;
        while ((int(a[i]) >= 0 && int(a[i]) <= 255 && a[i] != '\0')) 
        {
            i++;
        }
        return i;
    }
Добавлено через 1 минуту
Я понимаю что у меня есть LEN и формально мне с ним надо работать, но такие требования у меня что бы не использовать функцию strlen в конструкторе, мне сказали написать свою функцию и с ней работать...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class string
{
private:
 
    char* dyn;
    int LEN; //учитывать ли \0?
 
    int strlensv(const char* a)
    { //вернуть 0 (написать для nullptr)
        if (a == nullptr)
        {
            return 0;
        }
        int i = 0;
        while (int(a[i]) >= 0 && int(a[i]) <= 255 && a[i] != '\0') //как найти мусор
        {
            i++;
        }
        return i;
    }
    friend string operator+ (const char* a, string b);
    friend string operator+(string b, const char* a);
public:
 
    string(const char* a) : dyn{ new char(strlensv(a) + 1) }, LEN{ strlensv(a) }
    {
        if (strlensv(a) == 0)
        {
            this->dyn[0] = '\0';
 
        }
        else
        {
            for (int i = 0; i < strlensv(a); i++)
            {
 
                this->dyn[i] = a[i];
            }
        }
0
140 / 119 / 44
Регистрация: 09.03.2016
Сообщений: 1,019
14.03.2022, 01:18 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    char line[200]{"около озера он обнаружил оголённую Ольгу"};
    int i(0);
    while (line[++i] != '\0');
 
        std::cout<<"STRLEN -- " << i << std::endl;
    
    std::cin.get();
    return 0;
}
Похоже?
0
1311 / 946 / 335
Регистрация: 29.06.2020
Сообщений: 3,634
14.03.2022, 01:24 10
Цитата Сообщение от Xpystum Посмотреть сообщение
Я понимаю что у меня есть LEN и формально мне с ним надо работать, но такие требования у меня что бы не использовать функцию strlen в конструкторе, мне сказали написать свою функцию и с ней работать...
Ну вот, уже похоже на нормальную формулировку текущей задачи и нормальный вопрос.

C++
1
2
3
4
5
6
static size_t string::strlen(const char* str){
   size_t res=0;
   while(*str!='\0')
      ++res, ++str;
   return res;
}
Цитата Сообщение от Наталья8 Посмотреть сообщение
Похоже?
нет
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 69
14.03.2022, 01:31  [ТС] 11
Я вот про это имел ввиду, что бы обезопаситься, получается у нас там не инициализированная переменная передаётся, и strlen наш все равно будет высчитывать количество этого мусора пока не найдёт случайно где-то этот злощасный '\0'
Миниатюры
Пишем свой strlen  
0
1311 / 946 / 335
Регистрация: 29.06.2020
Сообщений: 3,634
14.03.2022, 01:32 12
Цитата Сообщение от Xpystum Посмотреть сообщение
Я вот про это имел ввиду, что бы обезопаситься, получается у нас там не инициализированная переменная передаётся, и strlen наш все равно будет высчитывать количество этого мусора пока не найдёт случайно где-то этот злощасный '\0'
Это проблема вызывающего кода, в правильности указателя и адекватности строки.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 69
14.03.2022, 01:34  [ТС] 13
А Бывает ещё такое что у нас, что у нас в переменной идёт например наши символы "Иван№%2в" - это пример) я поэтому и спрашивал как учитывать этот мусор) ну точнее сказать не учитывать)))

Добавлено через 1 минуту
Я понимаю, но разные люди будут работать с моим классом например - я хочу сделать так что бы не было косяков со стороны человека который будет работать с мои классом ну или хотя бы в будущем быстро нашёл ошибку - нежели он сидел и думал. я на это ориентируюсь)
0
1311 / 946 / 335
Регистрация: 29.06.2020
Сообщений: 3,634
14.03.2022, 01:46 14
Цитата Сообщение от Xpystum Посмотреть сообщение
Я понимаю, но разные люди будут работать с моим классом например - я хочу сделать так что бы не было косяков со стороны человека который будет работать с мои классом ну или хотя бы в будущем быстро нашёл ошибку - нежели он сидел и думал. я на это ориентируюсь)
Это программирование, ну другой стороне. вашим классом тоже программист сидит.
От дурака на самом деле никак не защититься.
Можно уменьшить так или иначе небезопасных ситуаций , но исключить - никак.
К тому же это все утяжеляет код и итоговую программу.

Единственный выход : отказаться от поддержки Си-строк;
А в качестве инициализатора, принимать только автоматические массивы и свои стринги.
Самому делать ввод из внешних источников. Замуроваться насмерть и повесится там )))

C++
1
2
3
double d;
char * pc = reinterpret_cast<char*>(&d);
cout << string::strlen(pc);
На минуточку )
Смысл понятен ?

Добавлено через 3 минуты
или
C++
1
2
3
4
char * text = new char[1024];
// что то там делаем с text
delete [] text;
cout << string::strlen(text);
text уже освобожден, и в ту же память уже могут быть записаны какие то другие данные.
Тут UB, неопределенное поведение.
0
140 / 119 / 44
Регистрация: 09.03.2016
Сообщений: 1,019
14.03.2022, 01:46 15
Массивы на куче тоже нультерминируються ?
0
1311 / 946 / 335
Регистрация: 29.06.2020
Сообщений: 3,634
14.03.2022, 01:54 16
Лучший ответ Сообщение было отмечено Xpystum как решение

Решение

Цитата Сообщение от Xpystum Посмотреть сообщение
Я понимаю, но разные люди будут работать с моим классом например - я хочу сделать так что бы не было косяков со стороны человека который будет работать с мои классом
Вы можете это гарантировать, только внутри своего класса, после того как он корректно инициализирован.
Корректность инициализации, зависит от вызывающего кода, в случае передачи С-строки.
А с вашей стороны. все будет выглядеть корректно в любом случае.

Добавлено через 1 минуту
Цитата Сообщение от Наталья8 Посмотреть сообщение
Массивы на куче тоже нультерминируються ?
их начальные адреса и размеры, сохраняются , и удаляются при освобождении этих самых массивов.

Добавлено через 4 минуты
Xpystum,
Цитата Сообщение от SmallEvil Посмотреть сообщение
Корректность инициализации, зависит от вызывающего кода, в случае передачи С-строки.
Можете вынудить вызывающий код , позаботиться о том , что бы указать. сколько символов из С-строки взять конструктором при инициализации, тогда вы явно укажете, что вызывающий код просто ОБЯЗАН об этом побеспокоится

C++
1
2
3
4
5
class string{
public:
   string(const char* str, size_t size){
// ....
}
Теперь ваш дорогой товарищ, будет осведомлен об ответственности, но все равно сможет накосячить, даже так.
0
140 / 119 / 44
Регистрация: 09.03.2016
Сообщений: 1,019
14.03.2022, 02:32 17
std::string нуль терминируем...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::string line= "около озера он обнаружил оголённую Ольгу";
        
    int i(0);
    while (line.c_str()[++i] != '\0');
 
    std::cout << "STRLEN -- " << i << std::endl;
 
    std::cin.get();
    return 0;
}
Добавлено через 47 секунд
line.c_str()[++i]
красиво?

Добавлено через 2 минуты
Нашёл нуль терминатор.
0
SmallEvil
14.03.2022, 02:36
  #18

Не по теме:

Цитата Сообщение от Наталья8 Посмотреть сообщение
std::string нуль терминируем...
Прям Колумб.

0
фрилансер
4158 / 3562 / 793
Регистрация: 11.10.2019
Сообщений: 9,594
14.03.2022, 06:40 19
Наталья8, std::string гарантирует ноль на конце своей строки всегда
0
С чаем беда...
Эксперт CЭксперт С++
9979 / 5333 / 1459
Регистрация: 18.10.2014
Сообщений: 12,818
14.03.2022, 07:03 20
Цитата Сообщение от Xpystum Посмотреть сообщение
про мусор я имел ввиду мусорные символы:
Что такое "мусорные символы" и чем они отличаются от "немусорных символов"?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2022, 07:03
Помогаю со студенческими работами здесь

Пишем свой Хамачи
Доброго времени суток! Я начинающий в C#. Пришла в голову мысль написать аналог хамачи с такими...

Написать свой strlen
Напишите и протестируйте свою функцию определения длины строки, полностью аналогичную библиотечной...

Пишем свой Keylogger (кейлоггер)
Хочу написать программу которая будет создавать лог-файл, куда будет записывать все нажатие...

Пишем свой слайдер изображений
Добрый день. Помогите пожалуйста с заданием: Пишем свой слайдер изображений отображаем...

Пишем свой OPC-server
Добрый день! У меня проблема с заданием в университете. Попросили разобраться с OPC-server. Я...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru