Цитата(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)

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