Проверить на валидность числа в массиве

Задан одномерный массив char. Например: char *str = “43,588 0 -1342 578 3 0” или (15 -12 5 0 13). Числа внутри массива разделены N-числом пробелов между собой.

Следует написать кратчайший алгоритм, проверяющий каждое из чисел внутри char массива на валидность. При не существующем числе вывести сообщение error. Пример не валидных чисел в массиве char *str = “-0642 567- 53,46-.

Простыми словами, следует обработать массив, чтобы числа записанные в него были существующими. При не существующем числе вывести сообщение error.

Я представляю как это делать на циклах и if, но мне нужен короткий алгоритм. Помогите пожалуйста.


Ответы (1 шт):

Автор решения: becouse

Можно использовать функцию strtok

Функция strtok выполняет поиск лексем в строке string. Последовательность вызовов этой функции разбивают строку string на лексемы, которые представляют собой последовательности символов, разделенных символами разделителями.

На первый вызов, функция принимает строку string в качестве аргумента, чей первый символ используется в качестве начальной точки для поиска лексем. В последующие вызовы, функция ожидает нулевого указателя и использует позицию сразу после окончания последней лексемы как новое местонахождение для сканирования.

параметры

string

Строка для поиска в ней лексем. Содержание этой строки будет изменено, она разбивается на более мелкие строки (лексемы). Данный параметр может содержать нулевой указатель, в этом случае функция продолжает сканирование с того места, где был остановлен предыдущий успешный вызов функции.

delim

Строка, содержащая разделители. Они могут варьироваться от одного вызова к другому вызову функции.

Определим, что мы считаем числом:

число:- [+-][1-9]\d*(\.*\d+)?
[+-] - начальный знак, необязательный
[1-9] - первая цифра не 0
далее несколько, возможно ни одной цифры \d
если есть ., то далее идет несколько цифр иначе не число

Пример кода. Функция check_input проверяет входную строку на валидное число. Три результата, ЦЕЛОЕ, ВЕЩЕСТВЕННОЕ, НЕЧИСЛО.

#include <stdio.h>
#include <string.h>
#define INT 1
#define FLOAT 2
#define NAN -1
int check_input(char * input){
    char *p=input;
    int state=0;
    int flag_sign=0;
    int flag_dot=0;
    int i=0;
    if (input[0]=='-'|| input[0]=='+'){
        i=1;
        flag_sign=1;
    }
    if (input[i]=='0'){
        return NAN;
    }
    while (i<strlen(input)){
        if (input[i]>='0' && input[i]<='9'){i++;}
        else {
            if (input[i]=='.' && flag_dot==0){
                flag_dot=1;
                i++;
            }
            else {
                return NAN;
            }
        }
    }
    if (flag_dot==0){return INT;}
        else {return FLOAT;}
}

int main ()
{
  char str[] ="-345 -0642 5f67- 53.46 -23 -12,23";
  char * pch;
  pch = strtok (str," ");
  while (pch != NULL)
  {
      int r=check_input(pch);
    if (r==INT){printf("%s => valid INT\n",pch);}
    if (r==FLOAT){printf("%s => valid FLOAT\n",pch);}
    if (r==NAN){printf("%s => not valid number\n",pch);}
    pch = strtok (NULL, " ");
  }

  return 0;
}

Вывод

-345 => valid INT
-0642 => not valid number
5f67- => not valid number
53.46 => valid FLOAT
-23 => valid INT
-12,23 => not valid number
→ Ссылка