реклама на сайте
подробности

 
 
> Как правильно делается sscanf для TEdit->Text, C++Builder 6
west329_
сообщение Jul 23 2009, 12:08
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Изучаю работу в окнах под C++Builder 6, до этого писаль только консольные приложеня.

Вопрос следующий, есть масив
Код
unsigned char IP[4];

потом на форме есть VCL компонент типа TEdit * EditIP, в поле которого пишется ИП адрес
в таком виде - 192.168.0.1

собственно в консольном приложении я делал так
Код
scanf("%d.%d.%d.%d", &IP_server[0], &IP_server[1], &IP_server[2], &IP_server[3]);


А как такое делается в Builder ? подскажите


так не работает
Код
sscanf(&IP[0],"%d.%d.%d.%d", Edit_IP->Text);

тоесть когда вывожу отладочную информацию то масив IP[] содержит одни нули
Код
Memo1->Lines->Add(d_str.sprintf("IP %d.%d.%d.%d", IP[0],IP[1],IP[2],IP[3]) );


для проверки
Код
Memo1->Lines->Add(Edit_Login->Text);
то ип переносится нормально

подскажите что неправильно ?

Сообщение отредактировал west329_ - Jul 23 2009, 12:45
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SSerge
сообщение Jul 24 2009, 11:21
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Нельзя недооценивать пользователя. Он запросто может ввести в это поле что угодно, вплоть до собственного имени, даты рождения или номера паспорта. Для разбора таких данных sscanf() уже мало пригодна, она больше для неинтерактивных данных, где есть уверенность что нужный формат соблюдается.
Нужно проконтролировать что числа находятся в диапазоне 0-255, что между ними действительно только одна точка, что чисел всего четыре, не больше и не меньше, и по любой ошибке выдать осмысленное сообщение.
Лучше разбирать строку по частям. Можно просто вручную считывать цифры и превращать их в число или применить функции типа atoi() или strtol(), потом проверить на '.', потом следующее число...

Ещё лучше сделать четыре отдельных поля ввода, по одному для каждого числа, проще будет и точек юзеру набирать не надо, они уже будут нарисованы на форме для ввода.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 24 2009, 21:37
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(SSerge @ Jul 24 2009, 14:21) *
Для разбора таких данных sscanf() уже мало пригодна, она больше для неинтерактивных данных, где есть уверенность что нужный формат соблюдается.
Если это разбор конфига - то ничем не отличается от ввода с экрана, может оказаться всё, что угодно.

Цитата(SSerge @ Jul 24 2009, 14:21) *
Нужно проконтролировать что числа находятся в диапазоне 0-255, что между ними действительно только одна точка, что чисел всего четыре, не больше и не меньше, и по любой ошибке выдать осмысленное сообщение.
Лучше разбирать строку по частям. Можно просто вручную считывать цифры и превращать их в число или применить функции типа atoi() или strtol(), потом проверить на '.', потом следующее число...
Ну если опускаться до "а вот восьмым символом строки после второго числа у Вас запятая, а там надо бы точку", то, конечно, со scanf-ом туго. А так - scanf вполне нормальная штука:
Код
#include <stdio.h>

void scan_ip(const char *str)
{
    unsigned IP[4];
    char ch;
    
    printf( "`%s' : ", str);

    int result = sscanf( str, "%u.%u.%u.%u%c", IP, IP+1, IP+2, IP+3, &ch);

    if(  result == 5 ) {
        printf( "extra character in string\n");
    } else if( result < 4) {
        printf( "not all numbers entered, may be numbers delimited with invalid character\n");
    } else if( IP[0] > 255 || IP[1] > 255 || IP[2] > 255 || IP[3] > 255) {
        printf( "numbers must be in range 0..255\n");
    } else {
        printf( "valid IP = %u.%u.%u.%u\n", IP[0], IP[1], IP[2], IP[3] );
    }
}


int main()
{
    scan_ip( "192.168.0.1" );
    scan_ip( "192.168.0" );
    scan_ip( "192168.0.1.2" );
    scan_ip( "192.168.0.1*" );
    scan_ip( "192.168,0.1" );
    scan_ip( "-192.168.0.1" );

    return 0;
}

Код
`192.168.0.1' : valid IP = 192.168.0.1
`192.168.0' : not all numbers entered, may be numbers delimited with invalid character
`192168.0.1.2' : numbers must be in range 0..255
`192.168.0.1*' : extra character in string
`192.168,0.1' : not all numbers entered, may be numbers delimited with invalid character
`-192.168.0.1' : numbers must be in range 0..255
Думаю, такой диагностики достаточно и нет смысла врукопашную atoi-чить.

Цитата(SSerge @ Jul 24 2009, 14:21) *
Ещё лучше сделать четыре отдельных поля ввода, по одному для каждого числа, проще будет и точек юзеру набирать не надо, они уже будут нарисованы на форме для ввода.
Это другое дело.
Заодно можно, как это уже реализовано то там, то сям - при выходе из поля если оно оставлено пустым - занулять.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- west329_   Как правильно делается sscanf для TEdit->Text   Jul 23 2009, 12:08
- - andrew_b   Цитата(west329_ @ Jul 23 2009, 16:08) так...   Jul 23 2009, 13:30
|- - Xenia   Кодsscanf(Edit_IP->Text.c_str(), ...   Jul 23 2009, 13:42
- - iosifk   Цитата(west329_ @ Jul 23 2009, 16:08) Воп...   Jul 24 2009, 04:56
- - ReAl   Мне другое интересно - как это по формату %d вводи...   Jul 24 2009, 09:07
|- - Xenia   Цитата(ReAl @ Jul 24 2009, 12:07) Мне дру...   Jul 24 2009, 09:31
|- - mdmitry   Цитата(SSerge @ Jul 24 2009, 15:21) Ещё л...   Jul 24 2009, 11:48
- - ReAl   С пробелами хуже... "192. 168. 0.1" указ...   Jul 25 2009, 12:57
- - Andrew2000   счас уже самолет получится... вопрос был про C++Bu...   Jul 25 2009, 19:56
- - west329_   Цитата(Andrew2000 @ Jul 25 2009, 22:56) И...   Jul 27 2009, 18:27
|- - Andrew2000   Qt http://www.qtsoftware.com/   Jul 27 2009, 21:13
- - defunct   Цитата(Andrew2000 @ Jul 25 2009, 22:56) е...   Jul 28 2009, 00:02
- - Andrew2000   Цитата(defunct @ Jul 28 2009, 04:02) В Ma...   Jul 30 2009, 07:16
- - defunct   Цитата(Andrew2000 @ Jul 30 2009, 10:16) Е...   Jul 30 2009, 22:04
- - XVR   Цитата(defunct @ Jul 31 2009, 02:04) Чем ...   Jul 31 2009, 06:42


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st August 2025 - 23:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016