Для этого можно использовать комбинацию strtoul()
и strpbrk()
.
Объявить двухсимвольные указатели start_ptr
и end_ptr
иstart_ptr
указывает на начало рассматриваемой строки.
char *start_ptr=s, *end_ptr;
, где s
- это массив символов размером 100, содержащий строку.
Поскольку ваша строка содержит только буквенно-цифровые символы, знак -
отсутствует и, следовательно, нетотрицательные числа.Таким образом, мы можем избежать использования целых чисел без знака.
Мы используем strtoul()
из stdlib.h
для выполнения преобразования строки в целое число.Итак, давайте объявим две переменные: rv
для хранения значения, возвращенного strtoul()
и sum
для хранения суммы чисел.
unsigned long rv, sum_val=0;
Теперь используем цикл:
for(; start_ptr!=NULL; )
{
rv = strtoul(start_ptr, &end_ptr, 10);
if(rv==ULONG_MAX && errno==ERANGE)
{
//out of range!
printf("\nOut of range.");
break;
}
else
{
printf("\n%lu", rv);
sum_val += rv;
start_ptr=strpbrk(end_ptr, "0123456789");
}
}
strtoul()
преобразует максимально возможную часть строки, а затем заставляет end_ptr
указывать на первый символ части строки, которая не может быть преобразована.
Возвращает ULONG_MAX
если число слишком велико и errno
будет установлено на ERANGE
.
В противном случае возвращается преобразованное число.
strpbrk()
будет искатьнабор символов (в данном случае символы 0-9) и возврат указателя на первое совпадение.В противном случае возвращается NULL
.
Не забудьте включить следующие заголовочные файлы:
stdlib.h ---> strtoul
string.h ---> strpbrk
limits.h ---> ULONG_MAX
errno.h ---> errno
Короче говоря, мы могли бы сделать программу примерно такой, как
for(; start_ptr!=NULL; sum_val += rv, start_ptr=strpbrk(end_ptr, "0123456789"))
{
rv = strtoul(start_ptr, &end_ptr, 10);
if(rv==ULONG_MAX && errno==ERANGE)
{
//out of range!
break;
}
}
printf("\n\n%lu", sum_val);
Таким образом, значение sum_val
для строки "12abcd4" будет равно 16
.
scanf()
, как правило, не лучший способ принять ввод, который не имеет надлежащего формата.Возможно, вместо этого вы можете использовать fgets()
- sscanf()
combo.
Если вы должны использовать scanf()
, убедитесь, что вы проверили возвращаемое им значение, которое в вашем случае должно быть 1
(число успешных назначений, выполненных scanf()
).
И для предотвращения переполнения используйте спецификатор ширины, как в
scanf("%99s",ch);
вместо
scanf("%s",ch);
как 100
- это размер массива символов ch
, и нам нужен один дополнительный байт для хранения разделителя строк (символ \0
).