указание переменной ширины поля в sscanf - PullRequest
3 голосов
/ 23 ноября 2011

У меня есть следующий sscanf оператор:

sscanf(line, "%*s %511s %511s",protocol,hexdata)

Теперь строка состоит из следующей формы " a b c ".Ясно, что я игнорирую значение a, задав %*s.Я беру значения b и c в протокол и данные.

Что я хотел бы сделать, так это то, что я не хочу жестко кодировать 511. Я просто не могу этого сделать.Я попробовал следующее, но это, похоже, не работает.

    sprintf(log_buffer,"1234 56789");
    printf("\n Buffer is : %s \n",log_buffer);

    strcpy(format,"%*s ");                    // gives %*s
    sprintf(format1, "%%%ds", 5);            // gives %5s
    printf("\n Format is : %s ",format);
    printf("\n Format1 is : %s ",format1);
    strcat(format,format1);
    printf("\n new format is : %s ",format);

    sscanf(log_buffer,format,name);

    printf(" Name is : %s ",name);
    printf(" \n Size of name %d ",strlen(name));

Это дает мне ненужную ценность.

Пример вывода:

Buffer is : 1234 56789
Format is : %*s
Format1 is : %5s
new format is : %*s %5s
Name is : �
8r�2�%*s %5s  
Size of name 15

Что здесь не так?Я просто должен предотвратить жесткое поле переменных.

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

мои объявления имеют следующий формат: [5] = {0};

Строка format может содержать 4 символа и нулевой терминатор. Этого недостаточно для "%*s %5s"!

Увеличить размер массива.

1 голос
/ 23 ноября 2011

Я подозреваю, что вы перезаписываете память в одном из ваших массивов символов. Вы не указали размеры ваших format,format1, name и log_buffer, так что я просто догадываюсь, кроме того, что код выглядит нормально.

При запуске, где каждый массив имеет размер 32 байта, он выдает следующий вывод (VS2008):

 Buffer is : 1234 56789

 Format is : %*s
 Format1 is : %5s
 new format is : %*s %5s  Name is : 56789
 Size of name 5 
0 голосов
/ 23 ноября 2011

Следует отметить, что значение 511, указанное в строке формата, не означает, что фактическое чтение строки имеет такое количество символов.

Значение 511 предоставляется для указания sscanf о том, сколько символов он может записать в переменную назначения (name в вашем примере). Вы должны рассматривать это как защиту от переполнения буфера.

...