char * argv - числа с плавающей запятой / int - PullRequest
0 голосов
/ 21 января 2020

Я получаю числа от argv[1] и должен различать guish между floating и int числами. Поэтому я решил сделать это с sscanf.

Попытка преобразовать string в float - мне не удалось. (если это значение int, оно не должно быть включено в вывод.)

Часть кода:

  float check;
  sscanf(argv[1], "%f", &check) == 1);
  if(check == 1){
     printf("is a float");
  }

Проблема в том, что sscanf возвращает 1, даже если это значение int. Как я могу остановить sscanf от возврата 1, если это значение int? Я также попробовал это с strtod, снова не удалось. Есть идеи, что я делаю не так?

С уважением,

Кейта

1 Ответ

1 голос
/ 21 января 2020

Int значения являются значениями с плавающей точкой, поэтому, если вы хотите различить guish между значениями с плавающей точкой, которые также являются целыми числами, и значениями с плавающей запятой, которые не являются целыми числами, вы должны сначала попробовать его как int. Кроме того, scanf вернет успех, если какой-либо префикс совпадает со спецификатором, и проигнорирует дополнительные элементы в конце строки. Если вы этого не хотите, вам нужно использовать% n и убедиться, что он поглотил всю строку. Таким образом, в результате вы получите:

float checkf;
int checki, len;
if (sscanf(argv[1], "%d %n", &checki, &len) >= 1 && argv[1][len] == 0) {
    printf("%s is an int\n", argv[i]);
} else if (sscanf(argv[i], "%f %n", &checkf, &len) >= 1 && argv[i][len] == 0) {
    printf("%s is a float\n", argv[i]);
} else {
    printf("%s is neither an int nor a float\n", argv[i]);
}

%n в строке формата, заставляя scanf сообщать, сколько символов ввода было использовано до этой точки в формате, и помещать его в конце Формат позволяет нам проверить, что конец формата совпадает с концом строки, и что на входе нет других искажений. В этом случае ввод с плавающей запятой, такой как 2.5, выглядит как целое число 2, за которым следует дополнительная строка .5 для первого вызова scanf, поэтому scanf будет успешным (возврат 1), но len будет установлен на . (поэтому argv[i][len] будет '.', а не 0)

...