Проверить на валидность числа в массиве
Задан одномерный массив 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 шт):
Можно использовать функцию 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