Найти сумму чисел в заданной строке - PullRequest
0 голосов
/ 14 декабря 2018

Мне нужно найти сумму чисел в данной строке. Например, для «a11b3» сумма будет возвращена 14, потому что (11 + 3 = 14) я написал следующий код, но он не работает для меня в любомситуация, как я могу оптимизировать это?

int SumStr(char* str)
{
    int i, sum = 0, digit = 0;
    while (*str)
    {
        digit = 0;
        while (*str >= '0' && *str <= '9' && *str)
        {
            digit = digit * 10 + (*str - '0');
            str++;
        }
        if (digit > 0)
            sum += digit;
        str++;
    }
    return sum;
}

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Вы можете перебрать строку с указателем;когда цифра найдена, указатель может быть передан в 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
0 голосов
/ 14 декабря 2018

Вы делаете еще на str++ больше, чем должны.

int SumStr(const char *str) {                        // added const
    int sum = 0, digit = 0;                          // removed i
    while (*str) {
        digit = 0;
        while (*str && *str >= '0' && *str <= '9') { // swapped order of conditions
            digit = digit * 10 + (*str - '0');
            str++;
        }
        if (digit > 0) sum += digit;
        else str++;                                  // added else
    }
    return sum;
}

см. https://ideone.com/Aerrh5

0 голосов
/ 14 декабря 2018

Как я могу его оптимизировать? .Я не уверен, как следующее оптимизирует с точки зрения скорости или объема памяти, но это делает код немного проще и более читабельным:

В следующем используются функции isdigit() и ASCII значения для подсчета чисел:

int main(void)
{
    char buf[] = {"abc23jrt5"};//sum of integers: 23 + 5 = 28
    int count = int SumStr(buf);

    return 0;   
}

//Edited to sum instances of numbers embedded in string.
//adjacent digits such as `11` in the string `avf11e5` are treated
//as the integer value `11`, not `1 + 1`.
int SumStr(char *buf)
{
    int i = 0;
    int sum = 0;
    while( *buf != 0 )
    {
        i = 0;
        while(isdigit(*buf))
        {
            i *= 10, i += *buf - '0';
            if(*buf != 0) buf++;
        }
        sum += i;
        if(*buf != 0) buf++;
    }
    return sum;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...