PDA

Просмотр полной версии : [Function] GetNums



Desulaid
22.07.2016, 22:14
Описание:
Работая над строкой, функция игнорирует все символы, кроме символов цифр. Результатом работы функции является целочисленное строковое значение. В случае, если строка не имеет цифр функция вернет ноль.

Функция:

stock GetNums(const src[], dest[], const size = sizeof dest)
{
new dest_size = size - 1, result;
for (new i = -1, j = 0, _char = 0; (_char = src[++i]);)
{
if ('0' <= _char <= '9')
{
dest[j++] = _char;
result = result * 10 + _char - '0';
if (j == dest_size)
{
dest[j] = '\0';
break;
}
}
}
return result;
}

Параметры:

(const src[], dest[], const size = sizeof dest)



src[]
- исходная строка для обработки.


dest[]
- буфер, куда записывается строковый аналог возвращаемого значения.


size
- число ячеек для обработки.



Пример:

new str[5];
printf("%d\n%s", GetNums("ст123рока4", str), str);
// функция вернет 1234
// массив str[] получит значение "1234"


Автор: Anton Styazhkin (http://pro-pawn.ru/member.php?4123-Anton-Styazhkin)


Специально для Pro-Pawn.ru (http://pro-pawn.ru/)
Копирование данной статьи на других ресурсах без разрешения автора запрещено.

ziggi
22.07.2016, 23:09
size предназначен для buff, но работает для string.
То есть эта функция не сработает тогда, когда должна:


new str[5]; // 5 ячеек достаточно для передаваемого числа
printf("%d\n%s", GetNums("ст123рока4", str), str); // в результате получим 123, а не 1234

Ещё функция сработает некорректно, если в передаваемом массиве уже что-то лежит.
Да и функции лучше со stock объявлять, чтобы не было предупреждений о не использовании.

Вот, переписал:


stock GetNums(const string[], buff[], const size = sizeof(buff))
{
new
i,
j,
symbol;

while ((symbol = string[i]) != '\0') {
if ('0' <= symbol <= '9') {
buff[j] = symbol;
j++;

if (j == size - 1) {
break;
}
}

i++;
}

buff[j] = '\0';
return strval(buff);
}

Desulaid
22.07.2016, 23:49
ziggi, спасибо :blush:.

Забыл про существование минуса. Добавил его "видимость". Если в массиве записалось "1-2йцу3", то это проблемы записавшего такую чушь (мне лень переделывать и нет).

ziggi
22.07.2016, 23:53
Забыл про существование минуса. Добавил его "видимость". Если в массиве записалось "1-2йцу3", то это проблемы записавшего такую чушь (мне лень переделывать и нет).

Ты этим минусов всё условие испортил, теперь оно всегда истинно. Да и скобку нужную удалил.

Desulaid
23.07.2016, 02:13
Ты этим минусов всё условие испортил, теперь оно всегда истинно. Да и скобку нужную удалил.

Окей :to_take_umbrage:.