2016-02-19 2 views
1

Есть ли какой-то трюк, который уже был встроен в одну из библиотек или мне нужно что-то написать, чтобы проверить его вручную? Следующий код помогает мне определить, было ли прочитано слишком мало числа параметров, но не слишком много, потому что sscanf останавливается, например, на 3, даже если в этой строке 5 параметров и идет в другую строку.c sscanf проверить, есть ли в строке несколько параметров?

if(sscanf(buffer, "%d", &elements->start_state_) != 1) 
{ 
    //code 
} 

P.S. имейте в виду, что я делаю линейный ввод.

Эта программа будет работать хорошо, если было прочитано 0 или 1 параметров, но более 1 не обнаружено и представляет проблему для меня.

+2

Все ли «параметры» в строках вы читаете целые числа? Затем вы можете использовать ['strtol'] (http://en.cppreference.com/w/c/string/byte/strtol), он даст вам указатель на следующий символ после номера и после пропуска ведущего белого -пространство, вы можете использовать его в цикле для чтения нескольких чисел. Или, возможно, используйте ['strtok'] (http://en.cppreference.com/w/c/string/byte/strtok) для разделения ввода на пробел. –

+0

Я боялся, что решение strtok не будет работать с несколькими пространствами, к счастью, это было :)! Неплохо –

ответ

2

Если я правильно понял, вы хотите узнать, есть ли что-нибудь после последнего использованного параметра на линии - я предполагаю, что вы получили линию по вызову fgets.

То, что я обычно делал перед, что проблема просто пытаются расшифровать один не пустой символ после последнего параметра:

char dummy[2]; /* save space for terminating null */ 
... 
if(sscanf(buffer, "%d%1s", &elements->start_state_, dummy) != 1) { 
    ... 
} 

Если нет ничего (слишком мало параметров) на линии sscanf будет возвращать слишком низко значение, и если есть хотя бы один непустой параметр, он вернет 1 слишком высоко.

1

Используйте "%n", чтобы сохранить количество проверенных до сих пор символов. Обратите внимание, что " " и "%n" не могут потерпеть неудачу и не внести свой вклад в результат sscanf().

int n = 0; 

// Allowing whitespace after the number 
sscanf(buffer, "%d %n", &elements->start_state_, &n); 

// or 
// Dis-allowing whitespace after the number 
sscanf(buffer, "%d%n", &elements->start_state_, &n); 

if (n == 0 || buffer[n]) { 
    // problem with buffer 
}