29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
|
|
1 | |
Функции для работы с типом char*28.12.2016, 01:21. Показов 9702. Ответов 20
Метки нет (Все метки)
Здравствуйте! Подскажите ресурс, где описана реализация основных функции для работы с указателями на строки
0
|
28.12.2016, 01:21 | |
Ответы с готовыми решениями:
20
Библиотека для удобной работы с типом string с++ Преобразовать массив с типом char в массив с типом int В чем разница между типом функции и типом возвращаемого значения? Класс для работы со скалярным типом данных в стиле языка Перл |
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
|
28.12.2016, 09:13 | 2 |
0
|
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
|
|
28.12.2016, 10:43 [ТС] | 3 |
nd2
Я имел ввиду не перечень функций и что они делают, а как такие функции сделаны
0
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
|
28.12.2016, 10:56 | 4 |
Эту тему почитай: Как посмотреть реализацию функций STL?
1
|
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
|
||||||
28.12.2016, 11:02 | 5 | |||||
Раз такая пьянка низкоуровневая, тогда может быть подскажешь?
есть 2 массива, один в виде:
суть в том что один массив формируется из HEX значений - для визуального удобства создания запросов, а второй массив это уже ответ от устройства - именно байтами и соответственно длина запроса strlen = 13 (запрос 12 + 1 \0 ?), ответ strlen = 5
0
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
|
28.12.2016, 11:04 | 6 |
1
|
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
|
|
28.12.2016, 11:04 [ТС] | 7 |
nd2 Спасибо большое!!! Если найдете еще, что нибудь подобное напишите, пожалуйста
0
|
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
|
|
28.12.2016, 11:17 | 9 |
в запросе их всего 5, в ответе 12, но сравнить надо с первыми 5
т.е. 2 массива - в теории - одинаковых, не равны друг другу, т.к. в одном данные в виде (первый байт) "\x81" в другом в виде символов (первый байт) - "Б"
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
28.12.2016, 11:18 | 10 |
1
|
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
|
|
28.12.2016, 11:24 | 11 |
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
28.12.2016, 11:31 | 13 |
nd2, я думаю, его проблема была в том, что один из буферов (или оба) не содержали нуль-символа. В этом случае strcmp пойдет гулять за пределы буфера и ничего хорошего не сравнит
0
|
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
|
||||||
28.12.2016, 11:34 | 14 | |||||
т.е. верный подход будет так выглядеть?
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
28.12.2016, 11:37 | 16 |
Верный подход - это когда ты понимаешь что тебе нужно сделать
Если у тебя есть буферы, просто буферы с произвольным содержимым - сравнивай их через memcmp. Если у тебя есть С-строки, сравнивай их через strncmp, strcmp.
0
|
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
|
||||||
28.12.2016, 11:44 | 17 | |||||
Мне нужно сравнить 2 буфера, исходящий и входящий, начало входящего пакета равно исходящему запросу - это как признак валидности запроса, остальное - байты тех или иных данных
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
28.12.2016, 11:54 | 18 |
Э - нет. Ты тут жестко заблуждаешься.
"Длина символов" - это результат работы strlen? Ну так если нет нуль-символа в массиве, то strlen будет неправильно работать. Пойдет смотреть за пределы буфера, а там можно и до AV доиграться. Опять же, "в виде символов - не равны" - это сравнение с помощью strcmp? Ну так эта функция точно так же, как strlen, смотрит нуль-символ, если его нет в массиве, то эта функция тоже будет неправильно работать. Будет сравнивать байты за пределами массива - мусор. А там как повезет уже. Напорется она в своем сравнении на защиту памяти и будет крах программы. strlen,strcmp - работают с С-строками. С-строка, это массив, оканчивающийся нулевым байтом. Оканчивающийся - это значит, что строкой считаются байты до первого нулевого байта в последовательности. Если в твоих буферах нулевые байты могут быть в середине или их вообще нет - эти буферы уже не будут С-строкой. Это обычные байтовые массивы. Ну а выше тебе правильно сказали. Численно байты с одинаковыми кодами равны, независимо от того в С-строке они находятся или в байтовом буфере. То, что строковые функции не работают (не сравнивают, считают неверно длину), - это следствие их некорректного применения к массивам без терминального нуля.
0
|
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 75
|
|
28.12.2016, 12:00 | 19 |
это вывод в консоль напрямую cout << check << "\n" << cmd;
т.е. визуальное сравнение - не равны, ну и по strcmp соответственно тоже не равны) почему я собственно и начал расследование не равности.. терминальный ноль\нуль - добавляется сам в выраженииях: 1. char array[2] = {'a', 'b'} ? 2. при наполнении массива char array[2]; через for array[i] ?
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
28.12.2016, 12:05 | 20 |
Нет, не добавляется.
Если только сам туда его явно запишешь, автоматически не добавляется. С чего это ты вообще взял? Добавлено через 1 минуту Вывод на консоль тоже требует наличия терминального нуля и, к тому же, символы должны быть печатаемые. А непечатаемые символы могут либо вообще не отображаться, либо отображаться зависимым от платформы способом. Так что это вообще не критерий Добавлено через 39 секунд Ты как будто не читал, что я тебе выше писал.
1
|
28.12.2016, 12:05 | |
28.12.2016, 12:05 | |
Помогаю со студенческими работами здесь
20
Работа с типом char Работа с типом Char Ошибка с типом char Строки с типом char * в С++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |