Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
1

Пишем свой strlen

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

Author24 — интернет-сервис помощи студентам
Всем привет, вырвал часть задание из общего задание по написанию своего 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.03.2022, 00:20
Ответы с готовыми решениями:

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

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

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

27
 Аватар для SmallEvil
3765 / 2693 / 762
Регистрация: 29.06.2020
Сообщений: 9,917
14.03.2022, 00:48 2
Цитата Сообщение от Xpystum Посмотреть сообщение
//как найти мусор
Открой мусорное ведро иль спроси у бомжа, на крайняк.

Добавлено через 57 секунд
Цитата Сообщение от Xpystum Посмотреть сообщение
вырвал часть задание из общего задание по написанию своего string
поздравляю, вот у тебя уже есть кусок мусора, даже искать не нужно.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
14.03.2022, 00:54  [ТС] 3
Спасибо за конструктивный ответ, может кто ещё подсказать без остроумных ответов?
про мусор я имел ввиду мусорные символы:
Миниатюры
Пишем свой strlen  
0
 Аватар для Наталья8
474 / 340 / 64
Регистрация: 09.03.2016
Сообщений: 3,359
14.03.2022, 00:59 4
Некоторые нультерминатор ищут.
Я не решаюсь. Всё равно обсерут.
0
 Аватар для SmallEvil
3765 / 2693 / 762
Регистрация: 29.06.2020
Сообщений: 9,917
14.03.2022, 01:04 5
Цитата Сообщение от Xpystum Посмотреть сообщение
конструктивный ответ
Если у тебя С-строка, признаком конца строки является символ '\0', его числовой код равен 0.
Если у тебя свой класс строки, стоит хранить размер строки отдельно, как это делает std::string.

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

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

Добавлено через 3 минуты
Xpystum, ну а к чему я хотел вас подтолкнуть, это к тому, что никакого "мусора" в ОЗУ нету.
Исходя из этого утверждения, должны были подумать, а что же есть ?
Но видимо вам все равно, что и как там есть. Вам же нужно мусор найти...
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
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
 Аватар для SmallEvil
3765 / 2693 / 762
Регистрация: 29.06.2020
Сообщений: 9,917
14.03.2022, 01:11 7
Цитата Сообщение от Xpystum Посмотреть сообщение
//учитывать ли \0?
не учитывать,

Цитата Сообщение от Xpystum Посмотреть сообщение
я же написал что я в стринге пишу свой стрлён
Но зачем, у вас уже есть переменная для длинны строки.
Когда какой то метод изменяет ее, просто изменяете переменную LEN.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
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
 Аватар для Наталья8
474 / 340 / 64
Регистрация: 09.03.2016
Сообщений: 3,359
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
 Аватар для SmallEvil
3765 / 2693 / 762
Регистрация: 29.06.2020
Сообщений: 9,917
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
Сообщений: 109
14.03.2022, 01:31  [ТС] 11
Я вот про это имел ввиду, что бы обезопаситься, получается у нас там не инициализированная переменная передаётся, и strlen наш все равно будет высчитывать количество этого мусора пока не найдёт случайно где-то этот злощасный '\0'
Миниатюры
Пишем свой strlen  
0
 Аватар для SmallEvil
3765 / 2693 / 762
Регистрация: 29.06.2020
Сообщений: 9,917
14.03.2022, 01:32 12
Цитата Сообщение от Xpystum Посмотреть сообщение
Я вот про это имел ввиду, что бы обезопаситься, получается у нас там не инициализированная переменная передаётся, и strlen наш все равно будет высчитывать количество этого мусора пока не найдёт случайно где-то этот злощасный '\0'
Это проблема вызывающего кода, в правильности указателя и адекватности строки.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
14.03.2022, 01:34  [ТС] 13
А Бывает ещё такое что у нас, что у нас в переменной идёт например наши символы "Иван№%2в" - это пример) я поэтому и спрашивал как учитывать этот мусор) ну точнее сказать не учитывать)))

Добавлено через 1 минуту
Я понимаю, но разные люди будут работать с моим классом например - я хочу сделать так что бы не было косяков со стороны человека который будет работать с мои классом ну или хотя бы в будущем быстро нашёл ошибку - нежели он сидел и думал. я на это ориентируюсь)
0
 Аватар для SmallEvil
3765 / 2693 / 762
Регистрация: 29.06.2020
Сообщений: 9,917
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
 Аватар для Наталья8
474 / 340 / 64
Регистрация: 09.03.2016
Сообщений: 3,359
14.03.2022, 01:46 15
Массивы на куче тоже нультерминируються ?
0
 Аватар для SmallEvil
3765 / 2693 / 762
Регистрация: 29.06.2020
Сообщений: 9,917
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
 Аватар для Наталья8
474 / 340 / 64
Регистрация: 09.03.2016
Сообщений: 3,359
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
14.03.2022, 02:36 18

Не по теме:

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

0
фрилансер
 Аватар для Алексей1153
6326 / 5447 / 1108
Регистрация: 11.10.2019
Сообщений: 14,504
14.03.2022, 06:40 19
Наталья8, std::string гарантирует ноль на конце своей строки всегда
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12847 / 6714 / 1805
Регистрация: 18.10.2014
Сообщений: 17,009
14.03.2022, 07:03 20
Цитата Сообщение от Xpystum Посмотреть сообщение
про мусор я имел ввиду мусорные символы:
Что такое "мусорные символы" и чем они отличаются от "немусорных символов"?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.03.2022, 07:03
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Неблокируемый стек в C++26: реализуем простой сборщик мусора
stackOverflow 02.03.2025
Многопоточные приложения требуют надежных и производительных структур данных, способных эффективно работать в условиях конкурентного доступа. Неблокируемые структуры данных представляют собой особый. . .
Шаблон REQ/REP в ZeroMQ: сверхбыстрый обмен сообщениями в C++ и Python
stackOverflow 02.03.2025
Построение высоконагруженных распределенных систем требует надежного и производительного механизма обмена сообщениями. ZeroMQ выделяется среди прочих решений своей невероятной скоростью работы и. . .
Нестандартные приемы работы с итераторами в C++
stackOverflow 02.03.2025
Итераторы - один из краеугольных камней C++, предоставляющий универсальный механизм обхода и манипуляции данными в контейнерах. Появившись как замена небезопасным указателям, они эволюционировали от. . .
Лексический анализ и регулярные выражения в C++26
stackOverflow 02.03.2025
Лексический анализ - ядро любого компилятора и инструмента обработки текста. Каждый программист сталкивается с задачами парсинга строк, обработки файлов конфигурации или анализа пользовательского. . .
Подробно о std::mdspan в C++23
stackOverflow 02.03.2025
Работа с многомерными массивами данных традиционно была одной из сложных задач в C++. Программистам приходилось создавать собственные абстракции или использовать сторонние библиотеки для эффективной. . .
Колмогоровская сложность в C++: Путь к совершенному коду
stackOverflow 02.03.2025
Абстрактная математическая теория Колмогорова стала мощным средством оценки и улучшения программного кода. Сложность алгоритма - не только в его вычислительной эффективности, но и в том, насколько. . .
Изменения в C# 14
stackOverflow 02.03.2025
Одно из самых значимых изменений в C# 14 - поддержка коллекционных выражений, которые позволяют создавать и инициализировать коллекции с помощью нового лаконичного синтаксиса. Это нововведение. . .
Разработка кроссплатформен­­­­ного мобильного приложения для iOS/Android на C++
bytestream 02.03.2025
C++ как язык программирования высокого уровня с прямым доступом к аппаратным ресурсам позволяет создавать приложения, работающие одинаково быстро как на iOS, так и на Android устройствах. Ни для кого. . .
Аутентификация/авторизация на Golang
bytestream 02.03.2025
Go предлагает множество возможностей для создания надежных систем аутентификации. Встроенные криптографические пакеты, высокая производительность и простота параллельной обработки запросов делают его. . .
Нововведения TypeScript 5.8
bytestream 02.03.2025
TypeScript 5. 8 приносит много возможностей и оптимизаций, которые существенно расширяют границы типобезопасного программирования на JavaScript. Эта версия включает ряд значительных улучшений в работе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru