Вы можете перебрать строку с указателем;когда цифра найдена, указатель может быть передан в strtol()
для преобразования оставшейся части строки в число.Функция strtol()
принимает указатель на начальную часть строки, подлежащую преобразованию (a char *
), и указатель на указатель, используемый для хранения указателя на оставшуюся часть строки, которая не может быть преобразована (char **
).Указателю конца в этом случае может быть присвоен адрес str
, поэтому после преобразования числа поиск цифр возобновляется после окончания преобразованного числа.
Обратите внимание, что strtol()
возвращаетlong
значение.Функция sum_str()
ниже возвращает long
.Вместо этого вы можете вернуть int
вместо этого, но если конечное значение sum
будет слишком большим, чтобы поместиться в int
, возвращаемое значение будет зависеть от реализации.
Некоторые тесты для обнаружения переполнения могут бытьдобавлен в цикл суммирования (и это было бы хорошей идеей).Не предусмотрено (и не предусмотрено) отрицательных чисел во входной строке.Обратите внимание, что простое изменение, допускающее использование отрицательных чисел во входной строке, будет просто включать проверку на наличие символа '-'
, за которым следует цифра:
if (isdigit(*str) || (*str == '-' && isdigit(*(str + 1)))) {
sum += strtol(str, &str, 10);
Входная строка, вероятно, должна быть проверена перед передачей еефункция.Должны ли быть разрешены строки без цифр?Должны ли быть разрешены строки с несколькими символами между числами?Должны ли быть разрешены строки с терминалом без цифр?Должны ли быть разрешены строки с десятичными точками?Ответы на эти вопросы позволят уточнить функцию sum_str()
и код, который ее вызывает.В приведенном ниже коде строки, не содержащие цифр, возвращают сумму нуля, группы из одного или нескольких нецифровых символов, включая десятичные точки, служат для разделения сумм цифр, которые необходимо суммировать, а конечные символы игнорируются после последней цифры.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
long sum_str(char *str);
int main(void)
{
printf("%ld\n", sum_str("a11b3c-4"));
return 0;
}
long sum_str(char *str)
{
long sum = 0;
while(*str) {
if (isdigit(*str)) {
sum += strtol(str, &str, 10);
}
if (*str) { // don't increment if end of string reached
++str;
}
}
return sum;
}
Вывод программы:
14