我必须找到给定字符串中数字的总和
例如,对于“ 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;
}

最佳答案

您可以使用指针遍历字符串。当找到数字时,可以将指针传递给strtol()以将字符串的其余部分转换为数字。 strtol()函数接受一个指向要转换的字符串的初始部分的指针(一个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

关于c - 查找给定字符串中的数字之和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53780083/

10-11 23:09
查看更多