Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:05     уточните по функции strlen один момент #1
Подскажите по функции strlen.
int len = strlen(key)
функция strlen возвращает длину строки в байтах.
допустим если strlen применить к строке с одним словом Start
int len=strlen(Start) тогда len чему будет равно в цифрах пяти???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2011, 16:05     уточните по функции strlen один момент
Посмотрите здесь:

atoi, scanf уточните пожалуйста C++
strlen C++
Не пойму один момент по проектированию C++
Уточните пожалуста название функции C++
Подскажите один момент в программе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
17.12.2011, 16:07     уточните по функции strlen один момент #2
lexflax, да
proof: http://liveworkspace.org/code/79e9f6...a3817837c633d0
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.12.2011, 16:12     уточните по функции strlen один момент #3
Цитата Сообщение от lexflax Посмотреть сообщение
функция strlen возвращает длину строки в байтах.
Не совсем так. Смотря что понимать под словом "длина".
strlen - возвращает кол-во символов (длина строки до нуль-символа)
Еще strlen (s) != sizeof (s)
http://www.cplusplus.com/reference/c...string/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;
}
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:23  [ТС]     уточните по функции strlen один момент #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 ? не могу понять почему в статье упор стоит на том что если первый и последний символ одинаковый тогда коллизия а не по длинне строки судится
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
17.12.2011, 16:24     уточните по функции strlen один момент #5
Цитата Сообщение от go Посмотреть сообщение
strlen - возвращает кол-во символов
это и есть длина
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:26  [ТС]     уточните по функции strlen один момент #6
кажись понял, потому что в том примере складываются только первый и послдений символ, только чему это будет равно в цифрах, допустим опять же слово Start? если сложить первый и последний символ то получится 5?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.12.2011, 16:37     уточните по функции strlen один момент #7
Цитата Сообщение от sandye51 Посмотреть сообщение
это и есть длина
Цитата Сообщение от lexflax Посмотреть сообщение
функция strlen возвращает длину строки в байтах.
Меня это смутило, думаю автор не совсем то понимает под словом "длина".
Надо различать
C
1
char c[2] = "qw";
http://codepad.org/idIe5sV0
Последний ведь ноль-символ, и мы должны его учитывать
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:38  [ТС]     уточните по функции strlen один момент #8
Цитата Сообщение от go Посмотреть сообщение
Последний ведь ноль-символ, и мы должны его учитывать
Описание.

Функция strlen возвращает в байтах длину строки string,
причем нулевой символ окончания ('') в длину не засчитывается.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.12.2011, 16:40     уточните по функции strlen один момент #9
Цитата Сообщение от lexflax Посмотреть сообщение
Функция strlen возвращает в байтах длину строки string,
причем нулевой символ окончания ('') в длину не засчитывается.
Я про это ведь и сказал
C
1
char str [N]; // strlen (str) всегда должна быть меньше чем N, если Вы не хотите ошибок
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 16:41     уточните по функции strlen один момент #10
Цитата Сообщение от lexflax Посмотреть сообщение
кажись понял, потому что в том примере складываются только первый и послдений символ, только чему это будет равно в цифрах, допустим опять же слово Start? если сложить первый и последний символ то получится 5?
Непонятно, как и зачем Вы связываете между собой сами символы и длину строки.
По поводу Вашей хэш-функции. У строк "cyberforum" и "cm" тоже первые и последние символы одинаковые и хэш-функция для них посчитает одинаковое значение - колиззия. У строки "cyberforum" длина 10, у "cm" - 2. Функция strlen в данном случае просто удобный способ индексации последнего символа строки.
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:44  [ТС]     уточните по функции strlen один момент #11
fasked да я просто не заметил что складываются первый и последний символ, думал сранивается об общей длинне... просто мне к моей программе по заданию надо сделать поиск с функцией хеширования программа есть поиск есть но без хеширования пытаюсь понять как лучше сделать и как то собрать в голове все в едино , более или менее
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 16:46     уточните по функции strlen один момент #12
lexflax, хэширование может быть в принципе любым - чем меньше коллизий, тем лучше. Главное, чтобы значение хэша в таблицу помещалось
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 16:48  [ТС]     уточните по функции strlen один момент #13
а вот что за таблица такая??? вот вырезка фразы с сайта одного по хеш функциям
"Другой пример – ключ-символьная строка С++. Хеш-функция отображает эту строку в целое число посредством суммирования первого и последнего символов и последующего вычисления остатка от деления на 101 (размер таблицы)." почему на 101 делится? и че за таблица такая подскажите плиз
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.12.2011, 16:53     уточните по функции strlen один момент #14
Цитата Сообщение от lexflax Посмотреть сообщение
а вот что за таблица такая???
http://ru.wikipedia.org/wiki/%D0%A5%...B8%D1%86%D0%B0
Цитата Сообщение от lexflax Посмотреть сообщение
почему на 101 делится?
Наверное, таблица имеет диапазон адресов ключей 0..100
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 16:53     уточните по функции strlen один момент #15
Цитата Сообщение от lexflax Посмотреть сообщение
почему на 101 делится?
Таблица - это массив. 101 в данном случае размер массива. Если не брать остаток от деления, то возможен выход за границы этого массива.
Цитата Сообщение от lexflax Посмотреть сообщение
и че за таблица такая подскажите плиз
Ну это Вы... википедию что ли почитайте.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.12.2011, 16:56     уточните по функции strlen один момент #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;
Я думаю, что на Си вы легко переведете.
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
17.12.2011, 17:23  [ТС]     уточните по функции strlen один момент #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 это размер массива? вроде объявления такого не вижу
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 20:31     уточните по функции strlen один момент
Еще ссылки по теме:

C++ Исключения, объясните один момент
C++ Написать программу: работа с си строками, функции strlen, strcpy

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 20:31     уточните по функции strlen один момент #18
Цитата Сообщение от lexflax Посмотреть сообщение
вроде объявления такого не вижу
Я тоже не вижу. Здесь же только функция вычисления хэша.
Yandex
Объявления
17.12.2011, 20:31     уточните по функции strlen один момент
Ответ Создать тему
Опции темы

Текущее время: 07:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru