Проверка IP адреса переданного в String
- Войдите на сайт для отправки комментариев
Сб, 01/04/2017 - 18:03
День добрый гуру!
У меня наблюдаются сложности переходя с VB на С+ и производные от него.
Буду очень благодарен в небольшой помощи...
В скетче имеется настройка сетевых реквизитов для Ehternet шилда через serial интерфейс...
в функции проверка верности введенных данных:
bool checkIP (String ChStr) { int a[4]; bool result; char byff[16]; int lenbyff; result = true; ChStr.toCharArray(buff[], lenbuff) sscanf(buff[],"%d.%d.%d.%d",&a[0],&a[1],&a[2],&a[3]); for (int i=0; i <= 3; i++){ if (a[i] < 0 && a[i] > 255) { result = false; } } return checkIP; }
'buff' was not declared in this scope
что не так то?
Объявили
А используете
:)
Пардон, но обявляю я имя массива и его размер, а использую массив целеком а не значение в индексе [16]?
Вот если кто поправит, буду благодаерн =)
Охх...ну, если не видите разницы в bUff и bYff, то совсем все плохо...
Вы уж определитесь, byff или buff.
Спасибо =) - глаза замылились...
но конструкция к сожелению все равно не работает. при передаче любой строки в функцию результат работы
sscanf - 485, 0, 1000, 0
1. Уберите [] в строка 8 и 10. Вы знаете для чего это? Ну, а не знаете, чего пихать?
2. Перед строкой 10 поставьте вывод в Serial buff
3. После строки 10 поставьте вывод в Serial массива a
Посмотрите, что печатается и разберётесь.
Всем спасибо, работает так:
Я С+ только начинаю... после VB шаблоны сломаны =)
vac,
оно, конечно, оптимизатор скорее всего всё разрулит и сам заменит, но некоторые люди считают не очень кошерным полагаться на оптимизатор, а предпочиатают писать нормально сами.
Так вот, запись
лоховскаяпаскалевская. На С кошерно тоже самое писать вот так:Недоработана функция...
Если ввести например 192.168.0.1.1 валидацию проходит
или 192.168.0.0568 => 192.168.0.056 тоже проходит
правда я немного ее изменил
Ну, а String то по значению нафига передавать? Он же будет память запрашивать и копироваться.
Так я делал как у автора... непонятный косяк ввожу 192.168.0.1.1 валидацию проходит...
как так, точка это же не цифра? и если 0123, то тоже проходит, просто обрезает при сохранении дальше у меня до 012
Ну, это Ваши дела. А String по значению передавать не надо.
Если сделать так
Блин, Вы как в том анекдоте:
или крестик сними, или трусы наденьили в строке 7 пишите "->" вместо "." или в строке 5 пишите "&" вместо "*" (второе мне нравится больше).Я не вижу где Вы это получаете. Единственная печать в Вашем кусочке печатает введённую строку как есть, потому странно было бы. если бы она печатала не то, что ввелось. scanf тут при каких делах я не понимаю.
Блин, Вы как в том анекдоте:
или крестик сними, или трусы наденьили в строке 7 пишите "->" вместо "." или в строке 5 пишите "&" вместо "*" (второе мне нравится больше).Пробовал, не работает? Ошибка collect2.exe: error: ld returned 1 exit status если & использовать
Туак не бывает, показывайте скетч полностью.
Он очень большой, сейчас соберу зависимые части
Не надо
Вы же говорите, что проблема с sscanf
Ну и сделайте маленький пример, который демонстрирует проблему.
очень большой я смотреть не буду.
Пример
Вход-выход: 192.168.0.01234 - 1921681081234, 192.168.108.512 - 192168108512
Вы не поняли. Я прошу Вас дать скетч целиком, как есть.
То, что Вы дали - это плод Вашей фантазии. Вот Вы пишете
Вход-выход: 192.168.0.01234 - 1921681081234, 192.168.108.512 - 192168108512
Но ведь это неправда! В какой строке Вашего скетча печатается дефис? А запятая в какой?
Дайте короткий скетч целиком, вместо с setup и loop, так, чтобы, если надо, я мог сам его запустить. Напишите, что Вы вводите, а СКОПИПАСТИТЕ его вывод.
Это я для наглядности написал
Я ж говорю, счетч очень большой я по websocket получаю данные вида {key:[ip,ip...]}.
Потом я его парсю и получаю чистый массив [192.168.108.0256, 192.168.108.1000, ...].
Передаю каждый элемент в функцию и это чистый вывод из функции с помощью Serial.print:
192.168.108.0256␍␊
192168108256␍␊
192.168.108.1000␍␊
1921681081000␍␊
Кажись я не там вывод Serial сделал, сори, все нормально
Давненько булки не разминал - вот, набросал корявенький валидатор, навскидку разную дичь не пропускает:
Пробовал здесь: https://www.jdoodle.com/online-compiler-c++ с вот такой программой:
Конечно, это не полноценный валидатор IP, если что, т.к. не учитывает, как минимум, диапазоны, и, как максимум - работает только с одним представлением адреса IPv4, а их - несколько.