Найти постоянное значение по заданной строке в c - PullRequest
0 голосов
/ 22 июня 2011

Нужно проверить Является ли данное строковое постоянное значение (целое / длинное / двойное) или нет?

Здесь функция strtol используется для поиска постоянного значения.Но сталкивается с проблемой

Пример:

   if(li1 = strtol (str,NULL,0))
       printf("valid Integer ...");
  1. str = "1" выход = 1,00
  2. str = "0.99999" выход = 0,00
  3. str = "tab"output = 0.00

Тогда как провести различие между "0.99999" и "tab", посмотрев на вывод?

1 Ответ

3 голосов
/ 22 июня 2011

Для целых чисел strtol предоставляет второй аргумент, который будет установлен, чтобы указывать на первый необратимый символ.

Если это что-то другое, нулевой терминатор \0, тогдав конце номера был мусор.Если она равна исходной строке, то не найдено подходящих символов.

Пример:

char *str = "72";

char *estr;
float val = strtol (str, &estr, 10);
if (estr == str) {
    // there was no convertible characters.
}
if (*estr != '\0') {
    // there was rubbish at the end.
}
if (errno != 0) {
    // underflow/overflow.
}

Для чисел с плавающей запятой необходимо использовать один из strtoX функции.

Действует очень похоже на функцию strtol.

Пример использования:

char *str = "0.9999";

char *estr;
float val = strtof (str, &estr);
if (estr == str) {
    // there was no convertible characters.
}
if (*estr != '\0') {
    // there was rubbish at the end.
}
if (errno != 0) {
    // underflow/overflow.
}

ФункцияЧтобы выяснить, какой тип представленной строки показан в полной программе ниже:

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

#define TYP_INTEGRAL 0
#define TYP_FLOATING 1
#define TYP_BAD      2
int getTypeAndData (char *str, long *valL, float *valF) {
    char *end;

    *valL = strtol (str, &end, 10);
    if ((end != str) && (*end == '\0'))
        return TYP_INTEGRAL;

    *valF = strtof (str, &end);
    if ((end != str) && (*end == '\0'))
        return TYP_FLOATING;

    return TYP_BAD;
}

int main (int argc, char *argv[]) {
    char *desc[] = {"INT", "FLT", "BAD"};
    int i, typ;
    long lvar;
    float fvar;
    for (i = 1; i < argc; i++) {
        lvar = 0; fvar = 0;
        typ = getTypeAndData (argv[i], &lvar, &fvar);
        printf ("%s: [%-10s] %10ld %10.3f\n", desc[typ], argv[i], lvar, fvar);
    }
    return 0;
}

При запуске с myprog 12345 hello 12.7 1e2 0.4 .1 "" 0, вывод:

INT: [12345     ]      12345      0.000
BAD: [hello     ]          0      0.000
FLT: [12.7      ]         12     12.700
FLT: [1e2       ]          1    100.000
FLT: [0.4       ]          0      0.400
FLT: [.1        ]          0      0.100
BAD: [          ]          0      0.000
INT: [0         ]          0      0.000

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

Обратите внимание, что это не напрямую связывает условия переполнения и переполнения.Значения по умолчанию возвращаются в этих случаях, поскольку они обычно являются разумными параметрами, но вы можете проверить errno после возврата, если хотите перехватить эти условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...