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

Функции для работы с типом char*

28.12.2016, 01:21. Просмотров 438. Ответов 20
Метки нет (Все метки)

Здравствуйте! Подскажите ресурс, где описана реализация основных функции для работы с указателями на строки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2016, 01:21
Ответы с готовыми решениями:

Библиотека для удобной работы с типом string с++
Привет, надо проводить много манипуляций со строками - обрезка, перенос строки,...

Преобразовать массив с типом char в массив с типом int
Что-то не получается у меня найти инфу именно с преобразованием массивов с char...

В чем разница между типом функции и типом возвращаемого значения?
Читаю статью https:// code-live. ru/post/cpp-functions/ (ссылку изменил дабы...

Класс для работы со скалярным типом данных в стиле языка Перл
помогите пожалуйста создать класс для работы со скалярным типом данных в стиле...

Ошибка с типом char
При запуске выдает ошибки связанные с char. На другой версии visual все...

20
nd2
2830 / 2399 / 1055
Регистрация: 29.01.2016
Сообщений: 8,037
28.12.2016, 09:13 #2
http://ru.cppreference.com/w/cpp/string/byte
http://www.cplusplus.com/reference/cstring/
0
Helldrg
26 / 55 / 6
Регистрация: 10.01.2011
Сообщений: 1,153
28.12.2016, 10:43  [ТС] #3
nd2
Я имел ввиду не перечень функций и что они делают, а как такие функции сделаны
0
nd2
2830 / 2399 / 1055
Регистрация: 29.01.2016
Сообщений: 8,037
28.12.2016, 10:56 #4
Эту тему почитай: Как посмотреть реализацию функций STL?
1
V2oD2o
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 72
28.12.2016, 11:02 #5
Раз такая пьянка низкоуровневая, тогда может быть подскажешь?
есть 2 массива, один в виде:
C++
1
char request[5] = { '\x81', '\x10', '\xF1', '\x81', '\x03' };
другой ввиде уже самих символов (байтов).. как их сравнить? strcmp сходства не видит

суть в том что один массив формируется из HEX значений - для визуального удобства создания запросов, а второй массив это уже ответ от устройства - именно байтами

и соответственно длина запроса strlen = 13 (запрос 12 + 1 \0 ?), ответ strlen = 5
0
nd2
2830 / 2399 / 1055
Регистрация: 29.01.2016
Сообщений: 8,037
28.12.2016, 11:04 #6
Цитата Сообщение от Helldrg Посмотреть сообщение
а как такие функции сделаны
https://github.com/lattera/glibc/tree/master/string
1
Helldrg
26 / 55 / 6
Регистрация: 10.01.2011
Сообщений: 1,153
28.12.2016, 11:04  [ТС] #7
nd2 Спасибо большое!!! Если найдете еще, что нибудь подобное напишите, пожалуйста
0
nd2
2830 / 2399 / 1055
Регистрация: 29.01.2016
Сообщений: 8,037
28.12.2016, 11:12 #8
Цитата Сообщение от V2oD2o Посмотреть сообщение
и соответственно длина запроса strlen = 13 (запрос 12 + 1 \0 ?), ответ strlen = 5
И что сравнить хочешь? Первые пять символов из запроса? Или что?
0
V2oD2o
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 72
28.12.2016, 11:17 #9
Цитата Сообщение от nd2 Посмотреть сообщение
И что сравнить хочешь? Первые пять символов из запроса? Или что?
в запросе их всего 5, в ответе 12, но сравнить надо с первыми 5

т.е. 2 массива - в теории - одинаковых, не равны друг другу, т.к. в одном данные в виде (первый байт) "\x81" в другом в виде символов (первый байт) - "Б"
0
DrOffset
7941 / 4612 / 1119
Регистрация: 30.01.2014
Сообщений: 7,512
28.12.2016, 11:18 #10
Цитата Сообщение от V2oD2o Посмотреть сообщение
как их сравнить?
std::memcmp
1
V2oD2o
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 72
28.12.2016, 11:24 #11
Цитата Сообщение от DrOffset Посмотреть сообщение
в десяточку, сработало, спасибо
0
nd2
2830 / 2399 / 1055
Регистрация: 29.01.2016
Сообщений: 8,037
28.12.2016, 11:27 #12
Цитата Сообщение от V2oD2o Посмотреть сообщение
т.к. в одном данные в виде (первый байт) "\x81" в другом в виде символов (первый байт) - "Б"
В любом случае коды сравниваются, как этот код выглядит - без разницы.
0
DrOffset
7941 / 4612 / 1119
Регистрация: 30.01.2014
Сообщений: 7,512
28.12.2016, 11:31 #13
nd2, я думаю, его проблема была в том, что один из буферов (или оба) не содержали нуль-символа. В этом случае strcmp пойдет гулять за пределы буфера и ничего хорошего не сравнит
0
V2oD2o
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 72
28.12.2016, 11:34 #14
Цитата Сообщение от DrOffset Посмотреть сообщение
nd2, я думаю, его проблема была в том, что один из буферов (или оба) не содержали нуль-символа. В этом случае strcmp пойдет гулять за пределы буфера и ничего хорошего не сравнит
т.е. верный подход будет так выглядеть?
C++
1
char startCommunication[6] = { '\x81', '\x10', '\xF1', '\x81', '\x03', '\0' };
0
nd2
2830 / 2399 / 1055
Регистрация: 29.01.2016
Сообщений: 8,037
28.12.2016, 11:35 #15
Цитата Сообщение от DrOffset Посмотреть сообщение
я думаю, его проблема была в том, что один из буферов (или оба) не содержали нуль-символа. В этом случае strcmp пойдет гулять за пределы буфера и ничего хорошего не сравнит
DrOffset, это я всё понял. Я написал насчёт его неправильных рассуждений: что от того как выглядят коды зависит результат сравнения.
Цитата Сообщение от V2oD2o Посмотреть сообщение
2 массива - в теории - одинаковых, не равны друг другу, т.к. в одном данные в виде (первый байт) "\x81" в другом в виде символов (первый байт) - "Б"
0
DrOffset
7941 / 4612 / 1119
Регистрация: 30.01.2014
Сообщений: 7,512
28.12.2016, 11:37 #16
Цитата Сообщение от V2oD2o Посмотреть сообщение
т.е. верный подход будет так выглядеть?
Верный подход - это когда ты понимаешь что тебе нужно сделать

Если у тебя есть буферы, просто буферы с произвольным содержимым - сравнивай их через memcmp. Если у тебя есть С-строки, сравнивай их через strncmp, strcmp.
0
V2oD2o
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 72
28.12.2016, 11:44 #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Верный подход - это когда ты понимаешь что тебе нужно сделать

Если у тебя есть буферы, просто буферы с произвольным содержимым - сравнивай их через memcmp. Если у тебя есть С-строки, сравнивай их через strncmp, strcmp.
Мне нужно сравнить 2 буфера, исходящий и входящий, начало входящего пакета равно исходящему запросу - это как признак валидности запроса, остальное - байты тех или иных данных

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
    
 
        ...
        char cmd[5] = { '\x81', '\x10', '\xF1', '\x81', '\x03' };
        ...
 
        bool ReadCMD(char cmd[], int countRequest /* длина запроса */, int countAnswer /* длина ответа */) {
        int i;
        DWORD iSize;
        char sReceivedChar;
        char answer[countAnswer] = ""; /* полный ответ */
        char check[countRequest] = ""; /* заголовок валидности */
        if (countAnswer>0) {
            for (i=1;i<=countAnswer;i++) {
                ReadFile(COMPort, &sReceivedChar, 1, &iSize, 0);
                answer[i-1] = sReceivedChar; /* наполнение полного ответа */
                if (i<=countRequest) { check[i-1] = sReceivedChar; } /* наполнение буфера валидности */
            }
        } 
        cout << "-> [";
        printHEX(cmd, countRequest-1);
        cout << "]\n<- [";
        printHEX(answer, countAnswer-1);
        cout << "]\n";
        if (memcmp([B]check[/B], [B]cmd[/B], sizeof(check)) == 0) { return true; } else { return false; }
    };
По факту если вывести check и cmd в виде HEX - то они равны, если в виде символов - не равны, длина символов - тоже не равна
0
DrOffset
7941 / 4612 / 1119
Регистрация: 30.01.2014
Сообщений: 7,512
28.12.2016, 11:54 #18
Цитата Сообщение от V2oD2o Посмотреть сообщение
если в виде символов - не равны, длина символов - тоже не равна
Э - нет. Ты тут жестко заблуждаешься.
"Длина символов" - это результат работы strlen? Ну так если нет нуль-символа в массиве, то strlen будет неправильно работать. Пойдет смотреть за пределы буфера, а там можно и до AV доиграться.
Опять же, "в виде символов - не равны" - это сравнение с помощью strcmp? Ну так эта функция точно так же, как strlen, смотрит нуль-символ, если его нет в массиве, то эта функция тоже будет неправильно работать. Будет сравнивать байты за пределами массива - мусор. А там как повезет уже. Напорется она в своем сравнении на защиту памяти и будет крах программы.
strlen,strcmp - работают с С-строками. С-строка, это массив, оканчивающийся нулевым байтом. Оканчивающийся - это значит, что строкой считаются байты до первого нулевого байта в последовательности.
Если в твоих буферах нулевые байты могут быть в середине или их вообще нет - эти буферы уже не будут С-строкой. Это обычные байтовые массивы.
Ну а выше тебе правильно сказали. Численно байты с одинаковыми кодами равны, независимо от того в С-строке они находятся или в байтовом буфере. То, что строковые функции не работают (не сравнивают, считают неверно длину), - это следствие их некорректного применения к массивам без терминального нуля.
0
V2oD2o
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 72
28.12.2016, 12:00 #19
Цитата Сообщение от DrOffset Посмотреть сообщение
"в виде символов - не равны" - это сравнение с помощью strcmp?
это вывод в консоль напрямую cout << check << "\n" << cmd;
т.е. визуальное сравнение - не равны, ну и по strcmp соответственно тоже не равны) почему я собственно и начал расследование не равности..

терминальный ноль\нуль - добавляется сам в выраженииях:
1. char array[2] = {'a', 'b'} ?
2. при наполнении массива char array[2]; через for array[i] ?
0
DrOffset
7941 / 4612 / 1119
Регистрация: 30.01.2014
Сообщений: 7,512
28.12.2016, 12:05 #20
Цитата Сообщение от V2oD2o Посмотреть сообщение
терминальный ноль\нуль - добавляется сам в выраженииях:
Цитата Сообщение от V2oD2o Посмотреть сообщение
1. char array[2] = {'a', 'b'} ?
Нет, не добавляется.

Цитата Сообщение от V2oD2o Посмотреть сообщение
2. при наполнении массива char array[2]; через for array[i] ?
Если только сам туда его явно запишешь, автоматически не добавляется.

С чего это ты вообще взял?

Добавлено через 1 минуту
Цитата Сообщение от V2oD2o Посмотреть сообщение
это вывод в консоль напрямую cout << check << "\n" << cmd;
Вывод на консоль тоже требует наличия терминального нуля и, к тому же, символы должны быть печатаемые.
А непечатаемые символы могут либо вообще не отображаться, либо отображаться зависимым от платформы способом.
Так что это вообще не критерий

Добавлено через 39 секунд
Цитата Сообщение от V2oD2o Посмотреть сообщение
ну и по strcmp соответственно тоже не равны
Ты как будто не читал, что я тебе выше писал.
1
28.12.2016, 12:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2016, 12:05

Работа с типом Char
Здравствуйте. У меня есть три переменные типа Char, размерность каждой...

Строки с типом char * в С++
Помогите написать программу по строкам c++ При написании программ ...

Работа с типом char
Пожалуйста, помогите понять разницу между этими записями: char a; char...


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

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

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