Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 09.03.2020
Сообщений: 25
1

Найти длину строки, без использования функции strlen()

02.04.2020, 13:50. Просмотров 5217. Ответов 115
Метки нет (Все метки)


Написать функцию, которая получает строку и возвращает длину строки. Без использования функции strlen ()
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2020, 13:50
Ответы с готовыми решениями:

Узнать длину строки не щитая функции strlen
Как узнать длину строки не щитая функции strlen?

Написать программу, которая определяет длину строки - strlen (число символов без завершающего нуль-символа)
Написать программу с помощью символьных строк и функции обработки строк. Библиотечные функции...

Функция strlen возвращает неверную длину строки
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int main () {...

Подскажите функцию, которая возвращает длину строки (string), strlen не подходит.
Подскажите функцию, которая возвращает длину строки (string), strlen не подходит!!!!!!

115
339 / 225 / 44
Регистрация: 24.09.2017
Сообщений: 1,414
02.04.2020, 14:18 2
Цитата Сообщение от Ya_android Посмотреть сообщение
функцию, которая получает строку
определитесь, каким образом:
http://cppstudio.com/post/7216/
0
Don't worry, be happy
16971 / 9852 / 1897
Регистрация: 27.09.2012
Сообщений: 24,429
Записей в блоге: 1
02.04.2020, 14:19 3
C++
1
2
std::string str("klllkklkl");
std::cout << str.size();
1
6426 / 4317 / 1745
Регистрация: 07.05.2019
Сообщений: 13,165
Записей в блоге: 1
02.04.2020, 14:33 4
Цитата Сообщение от Ya_android Посмотреть сообщение
Написать функцию, которая получает строку и возвращает длину строки. Без использования функции strlen ()
C++
1
2
3
4
5
6
7
size_t StringLen(const char *s)
{
    size_t ln = 0;
    while (s[ln])
        ++ln;
    return ln;
}
1
339 / 225 / 44
Регистрация: 24.09.2017
Сообщений: 1,414
02.04.2020, 17:30 5
oleg-m1973, вы передаёте массив const char по указателю. Если таким же образом передать string в строке:
C++
1
while (s[ln])
возникает ошибка: "выражение должно иметь тип bool (или тип с возможностью преобразования в bool).
С чем это связано?
Я организовал функцию так:
C++
1
2
3
4
5
6
unsigned int count(string str){
    unsigned int i = 0;
while (str[i] != string::npos ){
        i++;}
    return i;
}
в результате получаю количество символов меньше, чем должно быть.
В чём моя ошибка?
0
6426 / 4317 / 1745
Регистрация: 07.05.2019
Сообщений: 13,165
Записей в блоге: 1
02.04.2020, 17:35 6
Цитата Сообщение от Argus19 Посмотреть сообщение
oleg-m1973, вы передаёте массив const char по указателю. Если таким же образом передать string в строке:
Потому что не надо туда передавать std::string. Передавай str.c_str()
0
Комп_Оратор)
Эксперт по математике/физике
8634 / 4347 / 590
Регистрация: 04.12.2011
Сообщений: 13,010
Записей в блоге: 16
02.04.2020, 18:09 7
Argus19, американские люди верят что POTUS это President Of US. Нью-йоркеры особенно счастливы. Когда быстро это произносят : Tramp is POTUS.
Но им простительно. А вам зачем над npos'ом прикалываться? Он же - максимум для размера стринг. Беззнаковое и безневинное и абсолютно целое число.
Если имеете стринг то и c_str() не нужно трогать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
unsigned int count(const string &str){
    int i(0);
    auto it=str.begin() ;
while ( it++!=str.end() ){
        i++;}
    //patamushto trollolo)
    return str.size();
}
 
int main()
{
vector<string> strings={
"Strings", "are", "objects", "that", "represent", "sequences", "of", "characters"
};
for(const auto &str : strings)cout<<'\"'<<str<<'\"'<<" has length "<<count(str)<<endl;
return 0;
}
0
339 / 225 / 44
Регистрация: 24.09.2017
Сообщений: 1,414
02.04.2020, 18:17 8
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Передавай str.c_str()
Да. Так работает.
Функция, которую я смастерил, при строке длиной менее 20 символов пишет: string subscript out of range, а , если в строке больше или равно 20 символов, то функция возвращает всегда число 20. Не могли бы вы подсказать, почему так происходит?
0
6426 / 4317 / 1745
Регистрация: 07.05.2019
Сообщений: 13,165
Записей в блоге: 1
02.04.2020, 18:21 9
Цитата Сообщение от Argus19 Посмотреть сообщение
Функция, которую я смастерил, при строке длиной менее 20 символов пишет: string subscript out of range, а , если в строке больше или равно 20 символов, то функция возвращает всегда число 20. Не могли бы вы подсказать, почему так происходит?
Цитата Сообщение от Argus19 Посмотреть сообщение
while (str[i] != string::npos )
while (str[i] != 0)

Добавлено через 37 секунд
string::npos - это очень большое число, такой буквы нет.
0
339 / 225 / 44
Регистрация: 24.09.2017
Сообщений: 1,414
02.04.2020, 18:26 10
Цитата Сообщение от IGPIGP Посмотреть сообщение
А вам зачем над npos'ом прикалываться?
Я с ним знатно вспотел. И толком не понял его сути.
Смотрел в отладчике, строка не завершается нолём поэтому, поиск конца строки while(str[i] != '\0') естественно вызывает ошибку.
Вот и ищу простые способы определения конца строки. Вы предложили вектор, что уже сложновато для начального уровня.

Добавлено через 4 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
while (str[i] != 0)
и
C++
1
while(str[i] != '\0')
вызывают string subscript out of range.
Из-за чего и сыр-бор. Может быть из-за присвоения строк, например:
C++
1
string str1 = "У попа была собака. Он её любил.";
но cout << str1;
прекрасно отрабатывает. Чувствую, уже закипаю.
0
6426 / 4317 / 1745
Регистрация: 07.05.2019
Сообщений: 13,165
Записей в блоге: 1
02.04.2020, 18:34 11
Цитата Сообщение от Argus19 Посмотреть сообщение
вызывают string subscript out of range.
Это в дебаге вызывает. В релизе не должно. Ну и не нужно так искать завершающий ноль, какой смысл?
0
339 / 225 / 44
Регистрация: 24.09.2017
Сообщений: 1,414
02.04.2020, 18:51 12
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В релизе не должно.
Да. Странно, завершающего ноля нет, а стало отрабатывать правильно.
0
6426 / 4317 / 1745
Регистрация: 07.05.2019
Сообщений: 13,165
Записей в блоге: 1
02.04.2020, 18:53 13
Цитата Сообщение от Argus19 Посмотреть сообщение
Да. Странно, завершающего ноля нет, а стало отрабатывать правильно.
Он есть. В дебаге просто проверяется, что индекс меньше size().
0
Комп_Оратор)
Эксперт по математике/физике
8634 / 4347 / 590
Регистрация: 04.12.2011
Сообщений: 13,010
Записей в блоге: 16
02.04.2020, 19:04 14
Цитата Сообщение от Argus19 Посмотреть сообщение
Я с ним знатно вспотел. И толком не понял его сути.
Argus19, обе эти фразы плотно связанны. Argus19, я не могу отрицать, что иногда пытаюсь забодать задачу. Но тут нужно уметь вовремя отступить. Метод грубая гориллы силы иногда помогает. Но "иногда" - ключевое слово.
Смотрите: - забиваю в Гугл string::npos
первая ссылка:
http://www.cplusplus.com/refer... ring/npos/
тут сказано буквально:
Цитата Сообщение от ушлых ботанов
static const size_t npos = -1;

Maximum value for size_t
npos is a static member constant value with the greatest possible value for an element of type size_t.

This value, when used as the value for a len (or sublen) parameter in string's member functions, means "until the end of the string".

As a return value, it is usually used to indicate no matches.

This constant is defined with a value of -1, which because size_t is an unsigned integral type, it is the largest possible representable value for this type.
То есть:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Беззнаковое и безневинное и абсолютно целое число.
Когда поиск индекса (а стиринги они любят индексы - настоящие друзья стрингов это не итераторы) то npos - независящий от реализации конец. Но это не символ чар. Преобразование целых в чары существует и это добавляет остроты в ситуацию. Вам пока имеет смысл разобраться с методами поиска в строке (методы-члены класса string) и вы никогда не забудете npos. Это не терминирующий ноль.
0
339 / 225 / 44
Регистрация: 24.09.2017
Сообщений: 1,414
02.04.2020, 19:53 15
Цитата Сообщение от IGPIGP Посмотреть сообщение
npos - независящий от реализации конец.
Т.е. величина абстрактная и не зависящая от места поиска или выборки из строки? Т.е. проверять его бессмысленно?
К сожалению, запустить ваш код не удалось, много ошибок. У меня VS2010. Видимо, ваш код использует более поздние стандарты.
0
Комп_Оратор)
Эксперт по математике/физике
8634 / 4347 / 590
Регистрация: 04.12.2011
Сообщений: 13,010
Записей в блоге: 16
02.04.2020, 21:21 16
Цитата Сообщение от Argus19 Посмотреть сообщение
Т.е. величина абстрактная и не зависящая от места поиска или выборки из строки? Т.е. проверять его бессмысленно?
При поиске методами класса string ищется индекс. Тогда и проверяется. Но в принципе да, это величина выступающая в роли нуля "нулябельного" типа, вроде нульройнтера или нуль-терминатора. С философской точки зрения это тянется от людей писавших С. Никто не стал думать об абстракции nothing (ничто). А в принципе нужно было всего-то для каждого типа договориться, что максимальное значение на 1 меньше допустимого по разрядности. Тогда самое большое (зарезервированное) - значило бы нуль (ничто). Для целых ноль и такой нуль это были бы разные вещи. А потом для индексации массивов решили применять беззнаковый целый тип - обычно unsigned int (синоним ему size_t). Для каждого типа контейнера это свой typedef но обычно - один леший. Суть в том, что вернуть ничто в рамках этого типа нельзя. Вот и изголяются кто как может. Минус единица для беззнакового - максимальное значение. То есть для string предполагается, что нельзя создать строку длиной аж максимум string::size_type=string::npos, поэтому если в поиске вернуть его то это можно трактовать как - "нет индекса". То есть, найти ничто означает не найти ни чего.
Argus19, проитерируйте любым другим доступным способом. Мой код - улыбка. Глядя на него ясно, что если работаешь со строкой стандартной библиотеки, то длину она поддерживает своим методом size() и ни чего более городить не нужно)
0
339 / 225 / 44
Регистрация: 24.09.2017
Сообщений: 1,414
02.04.2020, 22:17 17
Цитата Сообщение от IGPIGP Посмотреть сообщение
Мой код - улыбка.
Я понял.
Цитата Сообщение от IGPIGP Посмотреть сообщение
и ни чего более городить не нужно
Я просто расширил пожелание ТС
Цитата Сообщение от Ya_android Посмотреть сообщение
Без использования функции strlen ()
дополнительно обойтись без size(). Понимаю, что глупо, если есть стандартные методы класса, но на форуме встречаются подобные задачи: возвести число в степень без использования pow() и т.д.
Ошибки в строках №17:"инициализация не агрегированных данных с помощью списка инициализации не допускается" и №20 : "символ, тип которого содержит спецификатор "auto" должен иметь инициализатор".

Добавлено через 35 минут
Ya_android, потренировался передавать строку в функции по примеру:
http://cppstudio.com/post/7216/
и два способа подсчёта количества символов в них:
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
40
41
42
43
44
45
46
47
#include <iostream>
#include <string>
using namespace std;
//Функции подсчёта символов в строках
unsigned int count(string str){
    unsigned int i = 0;
    while(str[i] != 0){
        i++;}
    return i;
}
 
unsigned int counter(string &str){
    unsigned int i = 0;
    while(str[i] != 0){
        i++;}
    return i;
}
 
size_t StringLen(const char  *s)
{
    size_t ln = 0;
    while (s[ln])
        ++ln;
    return ln;
}
unsigned int count1(const string &str){
    int i(0);
    auto it=str.begin() ;
while ( it++!=str.end() ){
        i++;}
    return i;       //str.size();
}
int main()
{
      setlocale (LC_ALL, "rus");
    string str = "На берёзе выросли 2 яблока и 3 груши";
    string str1 = "Сидел на ёлке дятел, досиделся - спятил.";
    string str3 = "По глади озера скользили три воробья и ворона";
     cout << str << endl;
      cout << "Количество символов в строке : " << count (str) << endl;
     cout << str1 << endl;  
      cout << "Количество символов в строке : " << StringLen(str1.c_str()) << endl;
     cout << str3 << endl;
      cout << "Количество символов в строке : " << counter (str3) << endl;
 system("pause");
return 0;
}
1
Комп_Оратор)
Эксперт по математике/физике
8634 / 4347 / 590
Регистрация: 04.12.2011
Сообщений: 13,010
Записей в блоге: 16
02.04.2020, 22:57 18
Argus19, молодец
До кучи:
C++
1
2
3
4
5
6
size_t StringLen(const char  *s)
{
    const char  *p=s ;
    while (*p++) ;      
    return p-s-1;
}
0
14034 / 7517 / 1779
Регистрация: 30.01.2014
Сообщений: 12,571
02.04.2020, 23:17 19
Цитата Сообщение от Argus19 Посмотреть сообщение
while(str[i] != 0){
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
проверяется, что индекс меньше size().
Argus19, Вместо этого
Цитата Сообщение от Argus19 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned int count(string str){
    unsigned int i = 0;
    while(str[i] != 0){
        i++;}
    return i;
}
 
unsigned int counter(string &str){
    unsigned int i = 0;
    while(str[i] != 0){
        i++;}
    return i;
}
Используйте такой код, должно работать всегда:
C++
1
2
3
4
5
6
7
unsigned int counter(const string &str){
    unsigned int i = 0;
    while(str[i] != 0){
        i++;
    }
    return i;
}
0
339 / 225 / 44
Регистрация: 24.09.2017
Сообщений: 1,414
02.04.2020, 23:22 20
IGPIGP, только в одной статье интернета нашел, что предложенный вами способ инициализации вектора применим только со стандарта С++11.
Цитата Сообщение от IGPIGP Посмотреть сообщение
До кучи:
мне этот код пока непонятен.

Добавлено через 4 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
такой код
Как-то уже обсуждалось, что передача строки по значению в некоторых случаях может создать проблему. Только я в своё время не записал и уже не помню в чём заключался смысл.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2020, 23:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

При попытке вычислить длину строки стандартной функцией strlen возникает ошибка
Есть код, в котором объявлена volatile-переменная c_buf, представляющая собой массив символов: ...

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

Удаление символов из строки без использования стандартной функции delete
Как удалить символы из строки без использования стандартной функции delete? конкретно моя задача:...

Найти максимальную длину строки в текстовом файле и распечатать все строки файла, имеющие такую длину
Найти максимальную длину строки в текстовом файле и распечатать все строки файла, имеющие такую...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.