簡體   English   中英

查找給定字符串中的數字之和

[英]Find a sum of numbers in a given string

我必須在給定的字符串中找到數字的總和。例如,對於“ 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

我該如何優化? 我不確定以下內容將如何在速度或內存大小方面進行優化,但這確實使代碼更簡單,更易讀:

以下使用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;
};

您比應做的多了一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM