Базовым регистром рекурсивной функции является условие *s == '\0'
, где s
- строка, переданная функции. То есть, когда встречается завершающий ноль строки.
Достаточно объявить только один параметр функции типа const char *
. И тип возвращаемого значения должен быть long long int
. Это снижает риск переполнения.
Функция может быть основана на использовании стандартной C функции strtoll
.
Вот демонстрационная программа.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
long long int sum( const char *s )
{
long long int value = 0;
if ( *s )
{
if ( isdigit( ( unsigned char )*s ) || *s == '+' || *s == '-' )
{
char *p;
value = ( strtoll( s, &p, 10 ) );
s = p;
}
else
{
++s;
}
value += sum( s );
}
return value;
}
int main(void)
{
const char *s = "123omaewamou7";
printf( "sum = %lld\n", sum( s ) );
return 0;
}
Вывод программы
sum = 130
Вы можете исключить, используя стандартную C функцию isdigit
(и соответственно заголовок <ctype.h>
), следующим образом
long long int sum( const char *s )
{
long long int value = 0;
if ( *s )
{
if ( ( '0' <= *s && *s <= '9' ) || *s == '+' || *s == '-' )
{
char *p;
value = ( strtoll( s, &p, 10 ) );
s = p;
}
else
{
++s;
}
value += sum( s );
}
return value;
}