Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915

strncmp - входные параметры

23.11.2020, 18:33. Показов 1372. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

Подскажите пожалуйста немного не могу понять, зачем в описании функции strncmp для входных массивов сказано, что принимает Си-строку:
C++
1
2
3
4
5
6
7
str1
C string to be compared.
str2
C string to be compared.
num
Maximum number of characters to compare.
size_t is an unsigned integral type.
То есть для функции strcmp - понятно, что чтобы функция поняла какие символы сравнивать ей нужно знать где заканчиваются собственно сами строки, но для strncmp - зачем?
Она же сравнивает по заданному "num" кол-ву.

По факту в VS2017 - можно передать массивы без '\0' и просто указать число символов и начальный элемент массива с которого нужно произвести сравнение и сравнение производится корректно.

Или я чего то не допонял ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.11.2020, 18:33
Ответы с готовыми решениями:

Как сделать чтобы программа отображала входные параметры самостоятельно
Всем привет! Нужно написать программу. В центре будет изображена 3д модель. а по бокам будет показаны входные данные, на которые...

Функция strncmp
int main() { setlocale(LC_ALL,"Rus"); char droids = { "R2D2" , "C3PO" , "R2A6" }; // имеющиеся дроиды ...

Входные параметры
Помогите за плюсик: использовать входные параметры функций со способом передачи данных “по значению”; Можно какой нить пример?

15
Злостный нарушитель
 Аватар для Verevkin
10233 / 5662 / 1260
Регистрация: 12.03.2015
Сообщений: 26,245
23.11.2020, 19:35
Цитата Сообщение от Optimus11 Посмотреть сообщение
но для strncmp - зачем?
Она же сравнивает по заданному "num" кол-ву.
Шоб сравнение не вылезло за пределы.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 19:45
Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите пожалуйста немного не могу понять, зачем в описании функции strncmp для входных массивов сказано, что принимает Си-строку:
Потому что эта функция сравнивает две си-строки. А Maximum number of characters нужен на случай, если у одной из этих строк не окажется нуля на конце.
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.11.2020, 19:51
Compares at most count characters of two possibly null-terminated arrays. [...] Characters following the null character are not compared.
https://en.cppreference.com/w/... te/strncmp
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.11.2020, 20:09  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Потому что эта функция сравнивает две си-строки. А Maximum number of characters нужен на случай, если у одной из этих строк не окажется нуля на конце.
Но теоретически и практически можно сравнивать и произвольные массивы получается, просто контролируя выход за эти массивы, как у memcmp. Хотя вы скажите, ну так и используй memcmp тогда
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 20:17
Цитата Сообщение от Optimus11 Посмотреть сообщение
Но теоретически и практически можно сравнивать и произвольные массивы получается, просто контролируя выход за эти массивы, как у memcmp. Хотя вы скажите, ну так и используй memcmp тогда
У строк сравнение заканчивается, когда найдётся ноль. memcmp будет сравнивать дальше.

Добавлено через 2 минуты
Вот эти две строки дадут разный результат при сравнении через strncmp и через memcmp
C++
1
2
"123\0 456"
"123\0 678"
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.11.2020, 20:21  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У строк сравнение заканчивается, когда найдётся ноль. memcmp будет сравнивать дальше.

Добавлено через 2 минуты
Вот эти две строки дадут разный результат при сравнении через strncmp и через memcmp
C++
1
2
"123\0 456"
"123\0 678"
Это да, но однако strncmp практически позволяет сделать вот так:

C++
1
2
3
4
5
6
char my_char1[] = "123\0 456";    
char my_char2[] = "456";
 
//Сравниваю my_char2 с частью my_char1:
 
int result = strncmp(&my_char1[4], my_char2, 3);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 20:23
Цитата Сообщение от Optimus11 Посмотреть сообщение
Это да, но однако strncmp практически позволяет сделать вот так:
Ну да. А что в этом такого? Всё вроде нормально
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.11.2020, 20:27  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну да. А что в этом такого? Всё вроде нормально
Просто более корректное описание для strncmp мне кажется было бы такое, типа:

C++
1
2
3
str1,str2 - массив char`ов, или С-строка.
strncmp - не выполняет проверку выхода за диапазон str1, str2. В случае выхода за диапазон результат не определен.
При нахождении '\0' - сверка завершается.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 20:30
Цитата Сообщение от Optimus11 Посмотреть сообщение
strncmp - не выполняет проверку выхода за диапазон str1, str2. В случае выхода за диапазон результат не определен.
Как раз наоборот, выполняет проверку выхода за диапазон (ты сам передаёшь этот диапазон параметром)
C++
1
2
3
char s1[] = {'1', '2', '3'};
char s2[] = "123456";
strncmp(s1, s2, std::min(std::size(s1), std::size(a2)));
Здесь гарантируется, что strncmp не выйдет за переделы s1
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.11.2020, 20:32  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Как раз наоборот, выполняет проверку выхода за диапазон (ты сам передаёшь этот диапазон параметром)
C++
1
2
3
char s1[] = {'1', '2', '3'};
char s2[] = "123456";
strncmp(s1, s2, std::min(std::size(s1), std::size(a2)));
Здесь гарантируется, что strncmp не выйдет за переделы s1
Под выходом за диапазон я имел ввиду вот так:

C++
1
2
3
char s1[] = {'1', '2', '3'};
char s2[] = {'1', '2', '3', '4', '5', '6'};
strncmp(s1, s2, 1000);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 20:32
А здесь будет выход за границы массива
C++
1
strcmp(s1, s2);
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
23.11.2020, 20:32
Цитата Сообщение от Optimus11 Посмотреть сообщение
но для strncmp - зачем?
Она же сравнивает по заданному "num" кол-ву.
Нет, она сравнивает две сишные строки, как две обычные сишные строки.

"num" - это максимальное кол-во символов, которое нужно сравнить.
Однако сравнение может завершиться и раньше, если длина строки окажется меньше, чем num

Цитата Сообщение от Optimus11 Посмотреть сообщение
По факту в VS2017 - можно передать массивы без '\0'
В с++ "строка" - это последовательность символов, которая заканчивается нуль-терминатором.
Если ваш массив не завершается нулем, значит ваш массив не является строкой, и значит вы используете инструмент не по назначению.

Использовать микроскоп для забивания гвоздей - так себе идея.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 20:33
Цитата Сообщение от Optimus11 Посмотреть сообщение
Под выходом за диапазон я имел ввиду вот так:
Любая функция отвалится, если ты передашь её на вход случайное число
1
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
23.11.2020, 21:01
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Любая функция отвалится, если ты передашь её на вход случайное число
Нет, не любая.

На языке с++ размеры массивов известны времени компиляции, и выход за их пределы несложно проконтролировать.

Кроме того, в современном с++ (constexpr since c++14) литерные строковые константы можно анализировать времени компиляции.

Проблема в том, что strncmp - сишная функция.
А язык си не обладает такими возможностями.

По этой причине, в комитет стандартизации языка поступили предложения о том, что бы внести в стандартную библиотеку c++версии с расширенными возможностями.
На гитхабе можно поискать проекты с готовыми реализациями.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.11.2020, 21:11
Цитата Сообщение от eva2326 Посмотреть сообщение
Нет, не любая.
Ну да, согласен. Функцию abs() так просто не завалишь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2020, 21:11
Помогаю со студенческими работами здесь

Входные параметры с перечислением
Привет всем! Нужно сделать процедуру с входными параметрами , с такой задачей. Например: id дома может быть null, если null тогда для...

Входные параметры запроса
Нужно сделать запрос, по полям из формы. Но проблема в том, что если поле пустое, запрос не выводит записи. Как сделать если поле пустое...

Входные параметры NULL
Привет! В процедуре есть 4 входных параметра Id , которые могут быть NULL, и если NULL то тогда производить выборку по всем Id. тогда нужно...

Входные и выходные параметры функции
Здравствуйте! Пытаюсь разобраться в объявлении функции, подскажите пожалуйста, если у меня есть метод генерирующий массив и метод...

Терминология. Входные и выходные параметры
Что за термины такие: входные параметры и выходные параметры? Что они из себя представляют? Откуда взялись? Или это просто разговорные...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru