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

Пишем свой strlen

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

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

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

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

27
Заблокирован
14.03.2022, 00:48
Цитата Сообщение от Xpystum Посмотреть сообщение
//как найти мусор
Открой мусорное ведро иль спроси у бомжа, на крайняк.

Добавлено через 57 секунд
Цитата Сообщение от Xpystum Посмотреть сообщение
вырвал часть задание из общего задание по написанию своего string
поздравляю, вот у тебя уже есть кусок мусора, даже искать не нужно.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
14.03.2022, 00:54  [ТС]
Спасибо за конструктивный ответ, может кто ещё подсказать без остроумных ответов?
про мусор я имел ввиду мусорные символы:
Миниатюры
Пишем свой strlen  
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,877
14.03.2022, 00:59
Некоторые нультерминатор ищут.
Я не решаюсь. Всё равно обсерут.
0
Заблокирован
14.03.2022, 01:04
Цитата Сообщение от Xpystum Посмотреть сообщение
конструктивный ответ
Если у тебя С-строка, признаком конца строки является символ '\0', его числовой код равен 0.
Если у тебя свой класс строки, стоит хранить размер строки отдельно, как это делает std::string.

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

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

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

Цитата Сообщение от Xpystum Посмотреть сообщение
я же написал что я в стринге пишу свой стрлён
Но зачем, у вас уже есть переменная для длинны строки.
Когда какой то метод изменяет ее, просто изменяете переменную LEN.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
14.03.2022, 01:13  [ТС]
Может когда-нибудь кому-нибудь понадобится решилось это условиям (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
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,877
14.03.2022, 01:18
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
Заблокирован
14.03.2022, 01:24
Цитата Сообщение от 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  [ТС]
Я вот про это имел ввиду, что бы обезопаситься, получается у нас там не инициализированная переменная передаётся, и strlen наш все равно будет высчитывать количество этого мусора пока не найдёт случайно где-то этот злощасный '\0'
Миниатюры
Пишем свой strlen  
0
Заблокирован
14.03.2022, 01:32
Цитата Сообщение от Xpystum Посмотреть сообщение
Я вот про это имел ввиду, что бы обезопаситься, получается у нас там не инициализированная переменная передаётся, и strlen наш все равно будет высчитывать количество этого мусора пока не найдёт случайно где-то этот злощасный '\0'
Это проблема вызывающего кода, в правильности указателя и адекватности строки.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
14.03.2022, 01:34  [ТС]
А Бывает ещё такое что у нас, что у нас в переменной идёт например наши символы "Иван№%2в" - это пример) я поэтому и спрашивал как учитывать этот мусор) ну точнее сказать не учитывать)))

Добавлено через 1 минуту
Я понимаю, но разные люди будут работать с моим классом например - я хочу сделать так что бы не было косяков со стороны человека который будет работать с мои классом ну или хотя бы в будущем быстро нашёл ошибку - нежели он сидел и думал. я на это ориентируюсь)
0
Заблокирован
14.03.2022, 01:46
Цитата Сообщение от 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
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,877
14.03.2022, 01:46
Массивы на куче тоже нультерминируються ?
0
Заблокирован
14.03.2022, 01:54
Лучший ответ Сообщение было отмечено 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
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,877
14.03.2022, 02:32
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

Не по теме:

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

0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,982
14.03.2022, 06:40
Наталья8, std::string гарантирует ноль на конце своей строки всегда
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,176
14.03.2022, 07:03
Цитата Сообщение от 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru