Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
#1

уточните по функции strlen один момент - C++

17.12.2011, 16:05. Просмотров 1494. Ответов 17
Метки нет (Все метки)

Подскажите по функции strlen.
int len = strlen(key)
функция strlen возвращает длину строки в байтах.
допустим если strlen применить к строке с одним словом Start
int len=strlen(Start) тогда len чему будет равно в цифрах пяти???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2011, 16:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос уточните по функции strlen один момент (C++):

Уточните пожалуста название функции
SimpleCat &TheFunction() //функция возвращяет ссылку на SimpleCat. {...

Функция strlen() на русской раскладке считает один символ за 2
Объясните пожалуйста почему функция "strlen()" считает очень странным образом...

Написать две пользовательские функции, эквивалентные стандартной функции strlen
Написать программу, содержащую две пользовательские функции определения длины...

Написать программу: работа с си строками, функции strlen, strcpy
С помощью данного алгоритма нужно вставить слово в конец и начало строки. С...

Реализовать собственные функции strcat, strcpy, strcmp, strlen
Добрый день. Помогите с задачей. Необходимо реализовать собственные функции...

Не пойму один момент по проектированию
Допустим, есть классы А и В. Файл А.h инклудит файл B.h. Но в классе А есть...

17
sandye51
программист С++
833 / 592 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
17.12.2011, 16:07 #2
lexflax, да
proof: http://liveworkspace.org/code/79e9f636b8053f3706a3817837c633d0
0
go
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
17.12.2011, 16:12 #3
Цитата Сообщение от lexflax Посмотреть сообщение
функция strlen возвращает длину строки в байтах.
Не совсем так. Смотря что понимать под словом "длина".
strlen - возвращает кол-во символов (длина строки до нуль-символа)
Еще strlen (s) != sizeof (s)
http://www.cplusplus.com/reference/clibrary/cstring/strlen/
Вот как можно ее реализовать самому
C
1
2
3
4
5
6
7
8
size_t strlen (const char *s)
{
        size_t i;
 
        for ( i = 0 ; s[i] ; ++i ) ;
 
        return i;
}
0
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:23  [ТС] #4
тогда как понять такую статью
Другой пример – ключ-символьная строка С++. Хеш-функция отображает эту строку в целое число посредством суммирования первого и последнего символов и последующего вычисления остатка от деления на 101 (размер таблицы).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// хеш-функция для символьной строки.
// Возвращает значение в диапазоне от 0 до 100
int HF(char *key)
{
  int len = strlen(key), hashf = 0;
 
  // если длина ключа равна 0 или 1, возвратить key[0].
  // иначе сложить первый и последний символ
  if (len <= 1)
    hashf = key[0];
  else
    hashf = key[0] + key[len-1];
 
  return hashf % 101;
}
Эта хеш-функция приводит к коллизии при одинаковых первом и последнем символах строки. Например, строки «start» и «slant» будут отображаться в индекс 29. Так же ведет себя хеш-функция, суммирующая все символы строки.
(Почему говорят что колизия будет если первый и последний одинаковый?? допустим если слова будут mtart и dtart ведь так и так длинна у них будет равна 5, а если одинаковое значение ,это и есть колизия, как это понять? я поэтому и спрашивал про функцию strlen ? не могу понять почему в статье упор стоит на том что если первый и последний символ одинаковый тогда коллизия а не по длинне строки судится
0
sandye51
программист С++
833 / 592 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
17.12.2011, 16:24 #5
Цитата Сообщение от go Посмотреть сообщение
strlen - возвращает кол-во символов
это и есть длина
0
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:26  [ТС] #6
кажись понял, потому что в том примере складываются только первый и послдений символ, только чему это будет равно в цифрах, допустим опять же слово Start? если сложить первый и последний символ то получится 5?
0
go
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
17.12.2011, 16:37 #7
Цитата Сообщение от sandye51 Посмотреть сообщение
это и есть длина
Цитата Сообщение от lexflax Посмотреть сообщение
функция strlen возвращает длину строки в байтах.
Меня это смутило, думаю автор не совсем то понимает под словом "длина".
Надо различать
C
1
char c[2] = "qw";
http://codepad.org/idIe5sV0
Последний ведь ноль-символ, и мы должны его учитывать
0
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:38  [ТС] #8
Цитата Сообщение от go Посмотреть сообщение
Последний ведь ноль-символ, и мы должны его учитывать
Описание.

Функция strlen возвращает в байтах длину строки string,
причем нулевой символ окончания ('') в длину не засчитывается.
0
go
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
17.12.2011, 16:40 #9
Цитата Сообщение от lexflax Посмотреть сообщение
Функция strlen возвращает в байтах длину строки string,
причем нулевой символ окончания ('') в длину не засчитывается.
Я про это ведь и сказал
C
1
char str [N]; // strlen (str) всегда должна быть меньше чем N, если Вы не хотите ошибок
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 16:41 #10
Цитата Сообщение от lexflax Посмотреть сообщение
кажись понял, потому что в том примере складываются только первый и послдений символ, только чему это будет равно в цифрах, допустим опять же слово Start? если сложить первый и последний символ то получится 5?
Непонятно, как и зачем Вы связываете между собой сами символы и длину строки.
По поводу Вашей хэш-функции. У строк "cyberforum" и "cm" тоже первые и последние символы одинаковые и хэш-функция для них посчитает одинаковое значение - колиззия. У строки "cyberforum" длина 10, у "cm" - 2. Функция strlen в данном случае просто удобный способ индексации последнего символа строки.
0
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:44  [ТС] #11
fasked да я просто не заметил что складываются первый и последний символ, думал сранивается об общей длинне... просто мне к моей программе по заданию надо сделать поиск с функцией хеширования программа есть поиск есть но без хеширования пытаюсь понять как лучше сделать и как то собрать в голове все в едино , более или менее
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 16:46 #12
lexflax, хэширование может быть в принципе любым - чем меньше коллизий, тем лучше. Главное, чтобы значение хэша в таблицу помещалось
0
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:48  [ТС] #13
а вот что за таблица такая??? вот вырезка фразы с сайта одного по хеш функциям
"Другой пример – ключ-символьная строка С++. Хеш-функция отображает эту строку в целое число посредством суммирования первого и последнего символов и последующего вычисления остатка от деления на 101 (размер таблицы)." почему на 101 делится? и че за таблица такая подскажите плиз
0
go
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
17.12.2011, 16:53 #14
Цитата Сообщение от lexflax Посмотреть сообщение
а вот что за таблица такая???
http://ru.wikipedia.org/wiki/%D0%A5%...B8%D1%86%D0%B0
Цитата Сообщение от lexflax Посмотреть сообщение
почему на 101 делится?
Наверное, таблица имеет диапазон адресов ключей 0..100
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 16:53 #15
Цитата Сообщение от lexflax Посмотреть сообщение
почему на 101 делится?
Таблица - это массив. 101 в данном случае размер массива. Если не брать остаток от деления, то возможен выход за границы этого массива.
Цитата Сообщение от lexflax Посмотреть сообщение
и че за таблица такая подскажите плиз
Ну это Вы... википедию что ли почитайте.
0
go
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
17.12.2011, 16:56 #16
Под рукой есть только такой код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
function hash (key : string[4]): integer;
var
  f: longint;
begin
    f:=ord (key[1]) - ord (key[2]) + ord (key[3]) - ord (key[4]);
{вычисляем функцию по значению ключа}
    f:=f+255*2;
{совмещаем начальную область значений функции с начальным адресом хеш-таблицы }
    f:=(f*10000) div (255*4);
{совмещаем конечную область значений функции с конечным адресом хеш-таблицы }
    hash:=f
end;
Я думаю, что на Си вы легко переведете.
0
lexflax
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 17:23  [ТС] #17
Цитата Сообщение от fasked Посмотреть сообщение
Таблица - это массив. 101 в данном случае размер массива. Если не брать остаток от деления, то возможен выход за границы этого массива.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// хеш-функция для символьной строки.
// Возвращает значение в диапазоне от 0 до 100
int HF(char *key)
{
  int len = strlen(key), hashf = 0;
 
  // если длина ключа равна 0 или 1, возвратить key[0].
  // иначе сложить первый и последний символ
  if (len <= 1)
    hashf = key[0];
  else
    hashf = key[0] + key[len-1];
 
  return hashf % 101;
}
где в коде выше показывается что 101 это размер массива? вроде объявления такого не вижу
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 20:31 #18
Цитата Сообщение от lexflax Посмотреть сообщение
вроде объявления такого не вижу
Я тоже не вижу. Здесь же только функция вычисления хэша.
0
17.12.2011, 20:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 20:31
Привет! Вот еще темы с решениями:

Подскажите один момент в программе
Код не мой, по этому не могу понять одну деталь,программа-калькулятор ...

Исключения, объясните один момент
Всем привет, подскажите в строчках в маин 28 и 35 ссылке присваивается объект ?...

Функция strlen перед вызовом моей функции портит строку в конфигурации Release MS Visual C++ 2013
Написал функцию RemoveChars, которая убирает символы перевода строки в строке....

atoi, scanf уточните пожалуйста
Здраствуйте. char a = &quot;12345&quot;; int b = atoi (a); все работает. А если мне...


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

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

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