2016-05-26 4 views
0

Я работаю с программой C (++), которая должна читать значения из файла. Эти значения могут быть целыми (подписанными или неподписанными) или числами с плавающей запятой. В настоящий момент файл содержит только десятичные числа (целые числа), поскольку спецификатор формата sscanf()%d представляется достаточным.Существует ли спецификатор общего формата для `sscanf`?

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

1 
+2 
-34 
12.5 
-13.5 
+00014.31000000 

Есть ли спецификатор формата, который может охватывать все эти случаи, или я вижу сны?

Благодаря

+1

Вы мечтали .... использовать 'fgets()'. –

+0

Укажите тип значения вместе со значением или сначала проверьте плавающий формат, и если он не работает, проверьте наличие интергеля. – 2501

+0

для C++ вы можете использовать 'cin <<' –

ответ

0

Я не думаю, что существует такая магия спецификатора, потому что вы тип аргументов, переданных sscanf() фиксирован.

Независимо от возможной потери точности целые числа можно рассматривать как числа с плавающей запятой (но не наоборот). Поэтому, если вам все равно, является ли ввод целым числом или числом с плавающей запятой, просто используйте fgets(input, BUFFER_SIZE, stdin);, а затем scanf(input, "%lf", &dblVal);.

Однако, если вы действительно заботитесь, вот пример того, как иметь дело с ними:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define BUFFER_SIZE 80 

int main(void) 
{ 
    char *input = malloc(BUFFER_SIZE); 
    char *endptr; 
    fgets(input, BUFFER_SIZE, stdin); 
    input[strcspn(input, "\n")] = '\0'; 

    long intVal = strtol(input, &endptr, 10); 
    if(!*endptr) 
    { 
     // input is an integer 
     printf("%ld", intVal); 
    } 
    else 
    { 
     // input is an floating point number 
     double dblVal; 
     int r, n; 
     r = sscanf(input, " %lf%n", &dblVal, &n); 
     if(r == 1 && n == strlen(input)) 
      printf("%g", dblVal); 
     else 
      puts("Invalid input"); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^