Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Sscanf и разделение значений точками  (Прочитано 7411 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mitia
Гость
« : 17-08-2005 15:49 » 

Если вместо точек поставить пробелы, то все сразу заработает, а с точками... Жаль

Код:
char *buffer;
buffer = "ver.7.1";

char texName[64];
int i1,i2;
sscanf(buffer, "%s.%d.%d", &texName,&i1,&i2);
cout<<texName;
cout<<i1<<" "<<i2;
Записан
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 17-08-2005 15:57 » 

When one or more whitespace characters (space, horizontal tab \t, vertical tab \v, form feed \f, carriage return \r, newline or linefeed \n) occur in the format string, input data up to the first non-whitespace character is read, or until no more data remains. If no whitespace characters are found in the input data, the scanning is complete, and the function returns.

An ordinary character in the format string is expected to match the same character in the input stream.
Это не оно? Улыбаюсь
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Mitia
Гость
« Ответ #2 : 17-08-2005 16:09 » 

эээ, давай теперь переводить... Улыбаюсь

Когда один или больше срец-символов (...)  встречаются в строке формата, вводимые данные читаются до появления первого такого символа или читается до конца. Если нет спец-символов в данных, то сканирование прекращается(или оконцено) и функция возвращает значение. Обычный символ в строке формата будет таким же, как и во входных данных.


Я че-то сталил \0 и нифига... мот чуть подробнее?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 17-08-2005 17:36 » 

Mitia, тебе помогут регулярные выражения - резать можно как угодно и с различными условиями. Кроме того, если формат фиксирован, то можно парсить "вручную".
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mitia
Гость
« Ответ #4 : 17-08-2005 18:05 » 

с регулярными выражениями дел никогда не имел, boost юзать не хочу... STL тоже.
Я просто поставлю пробел между данными - это легче всего, т.к. я  сам задаю формат. Если конкретней, то я на одном компе формирую строку и шлю ее по UDP. На другом компе принимаю и натравливаю на нее sscanf.

Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 18-08-2005 12:55 » 

Можно разбить строку на части вызовом strtok

Код:
int fun(char * buffer, char * texName, int * p_i1, int * p_i2)
{
    static char dot[] = ".";
    char * tok = strtok(buffer, dot);
    if (tok == NULL) { printf ("Bad string 1\n"); return -1; }
    strcpy(texName, tok);
    if ((tok = strtok(NULL, dot)) == NULL) { printf ("Bad string 2\n"); return -1; }
    *p_i1 = atoi(tok);
    if ((tok = strtok(NULL, dot)) == NULL) { printf ("Bad string 3\n"); return -1; }
    *p_i2 = atoi(tok);
    return 0;
}

fun возвращает 0, если удалось пропарсить строку, и -1 в случае ошибки в формате.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Mitia
Гость
« Ответ #6 : 18-08-2005 13:08 » 

спасибо, вроде как просветился и более или менее разобрался в этой теме.

Я сделал проще - я читаю через %3s, т.е. я знаю заранее первую строку и она всегда должна быть такое длины.
Записан
Anchorite
Гость
« Ответ #7 : 18-08-2005 16:06 » 

Mitia,  возможно ты уже все понял, но просто поясню - под шаблон %s подходит ВСЯ переданная sscanf строка. Вот поэтому и не работало.
Записан
vbb
Гость
« Ответ #8 : 25-08-2005 13:17 » 

Более универсальный способ, исользуя функцию strtok:
Код:
char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char *token;

void main( void )
{
   printf( "Sourse: %s\n\nTokens:\n", string );
   /* Establish string and get the first token: */
   token = strtok( string, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s\n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
}

Output -

Sourse: A string   of ,,tokens
and some  more tokens

Tokens:
 A
 string
 of
 tokens
 and
 some
 more
 tokens

Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines