Определите, является ли строка целым числом или плаванием в ANSI C

с использованием пользовательского округления

public int Round(double value)
{
    double decimalpoints = Math.Abs(value - Math.Floor(value));
    if (decimalpoints > 0.5)
        return (int)Math.Round(value);
    else
        return (int)Math.Floor(value);
}
9
задан James McNellis 20 June 2010 в 03:55
поделиться

8 ответов

Не используйте atoi и atof, когда эти функции возвращаются 0 при отказе. В прошлый раз я проверил 0, допустимое целое число и плавание, поэтому бывшее бесполезное для определения типа.

используйте strto {l, ул., ull, ll, d} функции, поскольку они устанавливают errno при отказе и также сообщают где преобразованные законченные данные.

strtoul: http://www.opengroup.org/onlinepubs/007908799/xsh/strtoul.html

этот пример предполагает, что строка содержит единственное значение, которое будет преобразовано.

#include <errno.h>

char* to_convert = "some string";
char* p = to_convert;
errno = 0;
unsigned long val = strtoul(to_convert, &p, 10);
if (errno != 0)
    // conversion failed (EINVAL, ERANGE)
if (to_convert == p)
    // conversion failed (no characters consumed)
if (*p != 0)
    // conversion failed (trailing data)

Благодаря Jonathan Leffler для указания, что я забыл устанавливать errno на 0 сначала.

34
ответ дан 4 December 2019 в 05:58
поделиться

Используя sscanf, можно быть уверены, является ли строка плаванием или интервалом или безотносительно не имея необходимость к особому случаю 0, как имеет место с atoi и atof решением.

Вот некоторый пример кода:

int i;
float f;
if(sscanf(str, "%d", &i) != 0) //It's an int.
  ...
if(sscanf(str "%f", &f) != 0)  //It's a float.
  ...
9
ответ дан 4 December 2019 в 05:58
поделиться

Я предполагаю, что Вы могли ступить через строку и проверить, существует ли кто-либо . символы в нем. Это - просто первая вещь, которая появилась в мою голову, хотя, таким образом, я уверен, существуют другие (лучшие) способы быть более бесспорным.

2
ответ дан 4 December 2019 в 05:58
поделиться

atoi и atof преобразуют или возвратят 0, если он не может.

3
ответ дан 4 December 2019 в 05:58
поделиться

Я соглашаюсь с Patrick_O, что strto {l, ул., ull, ll, d} функции являются лучшим способом пойти. Существует несколько точек для наблюдения все же.

  1. Обнуленный errno прежде, чем вызвать функции; никакая функция не делает это для Вас.
  2. Страница Open Group, связанная с (в который я перешел прежде замечающий, что Patrick связался с нею также), указывает, что errno не может быть установлен. Это установлено на ERANGE, если значение вне диапазона; это может быть установлено (но одинаково, может не быть установлен) к EINVAL, если аргумент недействителен.

В зависимости от задания под рукой, я буду иногда располагать перескочить через конечный пробел от конца указателя преобразования, возвращенного, и затем жаловаться (отклоняют), если последний знак не является завершающимися пустыми '\0'. Или я могу быть неаккуратным, и мусор, которому позволяют, появляются в конце, или я могу принять дополнительные множители как 'K', 'M', 'G', 'T' для килобайтов, мегабайтов, гигабайтов, терабайт... или любого другого требования на основе контекста.

3
ответ дан 4 December 2019 в 05:58
поделиться

Используйте strtol/strtoll (не atoi) для проверки целых чисел. Используйте strtof/strtod (не atof) для проверки, удваивается.

atoi и atof преобразовывают начальную часть строки, но не говорят Вам, использовали ли они всю строку. strtol/strtod говорят Вам, был ли дополнительный спам после того, как символы преобразовали.

Так в обоих случаях не забудьте передавать в непустом параметре ХВОСТА и проверять, что он указывает в конец строки (то есть, ** ХВОСТ == 0). Также проверьте возвращаемое значение на потерю значимости и переполнение (см. страницы справочника или стандарт ANSI для деталей).

Обратите внимание также, что strod/strtol пропускают начальный пробел, поэтому если Вы хотите рассматривать строки с начальным пробелом, как плохо отформатировано, также необходимо проверить первый символ.

2
ответ дан 4 December 2019 в 05:58
поделиться

Это действительно зависит от того, почему Вы спрашиваете во-первых.

Если Вы просто хотите проанализировать число и не знаете, является ли это плавание или целое число, то просто анализируют плавание, это правильно проанализирует целое число также.

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

1
ответ дан 4 December 2019 в 05:58
поделиться

atoi и atof преобразуют число, даже если там запоздают нечисловые символы. Однако при использовании стертола и strtod, он не только пропустит ведущий пробел и дополнительный знак, но оставит Вас с указателем на первый символ не в числе. Затем можно проверить, что остальное - пробел.

1
ответ дан 4 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: