如何在c++中计算一个字符串中所有数字的总和,如“10+5+6+31+3+45”,

o75abkj4  于 2022-12-03  发布在  其他
关注(0)|答案(3)|浏览(284)

我发现这个代码,但这个总和所有的数字,但我希望它的广告31而不是3+1输出:28预期值:100

#include<stdio.h>  
int main()
{
    //Initializing variables.
    char str[100] = "10+5+6+31+3+45";
    int i,sum = 0;
    
    //Iterating each character through for loop.
    for (i= 0; str[i] != '\0'; i++)
    {
        if ((str[i] >= '0') && (str[i] <= '9'))  //Checking for numeric characters.
        {
            
            sum += (str[i] - '0'); //Adding numeric characters.

        }
    }
    //Printing result.
    printf("Sum of all digits:\n%d", sum);
    return 0; 
}
3pvhb19x

3pvhb19x1#

由于分隔符显然是加号,因此可以使用“strkok”字符串函数,如以下链接strkok example所示。
在初始代码中使用该方法会产生以下代码片段。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    //Initializing variables.
    char str[100] = "10+5+6+31+3+45";
    int sum = 0;
    char *token;
    const char s[2] = "+";

    /* get the first token */
    token = strtok(str, s);

    /* walk through other tokens */
    while( token != NULL )
    {
        sum = sum + atoi(token);

        token = strtok(NULL, s);
    }
    //Printing result.
    printf("Sum of all numbers is: %d\n", sum);
    return 0;
}

测试此代码会导致以下终端输出。

Sum of all numbers is: 100

Process returned 0 (0x0)   execution time : 0.035 s
Press any key to continue.

你可以试试这个方法,看看它是否符合你项目的精神。

iyzzxitl

iyzzxitl2#

我们可以在字符串中向后迭代,把所有的数字相加,除了我们在另一个数字后面看到的一个数字值高10倍,因为它在数字中处于更重要的位置。

#include <stdio.h>
#include <string.h>

int main() {
  char str[] = "10+5+6+31+3+45";

  unsigned int sum = 0;
  unsigned int digit_value = 1;

  unsigned int length = strlen(str);
  for (unsigned int i = 0; i < length; i++) {
    char c = str[length - 1 - i];
    if (c == '+') {
      digit_value = 1;
    }
    else if (c >= '0' && c <= '9') {
      sum += digit_value * (c - '0');
      digit_value *= 10;
    }
  }

  printf("Sum: %d\n", sum);
}

这是一个非常专业的解析器,专门用来处理你的特定类型的问题。一旦你添加了复杂的东西(比如减号),这个解析器就可能需要重写。

cgyqldqp

cgyqldqp3#

试试这个:
第一个
在这个程序中,我们只依靠字符的算术运算。我们开始字符串00000000(八个零:很容易扩展),并将其视为一个计数器,我们将其递增输入字符串中连续元素的值,如1+2+3
我们向后扫描输入字符串,例如,假设字符串以+23结尾,我们首先访问3:

00000000
       3
       ^

我们将字符串的最后一个数字增加该数字的数值,即'3' - '0'。接下来,我们遇到232,记住我们是反向操作:

00000003
      2
      ^

我们将数字2的值添加到字符串中的第二个数字:

00000023

接下来,我们在+23中看到+字符,这意味着我们将重置数字位置;下一次看到一个数字时,我们将它添加到个位数列。假设输入以+9+23结束。我们将处理的下一个数字是9

00000023
       9
       ^

当我们将数字3增加9时,我们得到< ASCII字符:

0000002<

这个字符超出了9,所以我们有溢出。为了处理这个问题,我们减去10,并将1进位到下一列。

1
00000022

所以我们的累加器变成:

00000032

相关问题