计算字符串中所有数字的总和

时间:2020-02-11 13:44:17

标签: c arrays string algorithm

我正在解决这个问题:

给出一个包含字母数字字符的字符串str,计算总和 出现在字符串中的所有数字中。

输入:

输入的第一行包含一个整数T,它表示测试用例的数量。然后进行T检验 案件接follow而至。每个测试用例都包含一个包含字母数字字符的字符串。

输出:

打印字符串中所有数字的总和。

约束:

1 <= T <= 10 5

1 <=字符串长度<= 10 5

示例: 输入

4
1abc23
geeks4geeks
1abc2x30yz67
123abc

输出:

24
4
100
123

我提出了以下解决方案:

#include <stdio.h>
#include <string.h>
int main() {
    //code
int t,j;
char a[100000];
scanf("%d",&t);
 while(t--)
 {   
    int sum=0,rev=0,i=0,l;
    scanf("%s",a); 
    l=strlen(a);
    for(i=0;i<l;i++) 
    {
          if (isdigit(a[i])){
             while(isdigit(a[i])){
               rev = rev *10 + (a[i]-48);
               i++;
             }
          }
        sum+=rev;
        rev=0;        
    }
    printf("%d\n",sum);
 }
    return 0;
}

此代码运行正常。 但是,如果循环终止条件从 i 更改为 a [i]!='\ 0',则代码不起作用。为什么?

3 个答案:

答案 0 :(得分:2)

如果您希望在for循环条件中更改逻辑,则也必须更改while循环中的逻辑,因为很有可能在字符串的末尾也存在数字,例如您的输入之一{{ 1}}。因此,正确的代码如下所示:

代码段:

1abc2x30yz67

进一步检查时,您的while循环条件中也始终需要 i 的条件。

 for(i=0;a[i]!='\0';i++) 
    {
          if (isdigit(a[i])){
             while(a[i]!='\0' && isdigit(a[i])){ // this line needs check as well
               rev = rev *10 + (a[i]-48);
               i++;
             }
          }
        sum+=rev;
        rev=0;        
    }

更新#1:

更精确地说,循环while(i < l && isdigit(a[i])){ 一直持续到字符串结尾。尽管它不会因为while(isdigit(a[i])){不是数字而在循环本身中引起问题,但是在for循环条件下,\0使您可以访问字符串长度范围之外的内容,因为我们前进了1因为a[i] != '\0'在for循环中有更多位置,而我们已经在内部while循环中到达了字符串的结尾。

更新#2:

您还需要另外检查i++才能使a[i] == '\0'递减。

i

更新#3:

您可以完全避免while循环,如下所示:

#include <stdio.h>
#include <string.h>
int main() {
    //code
int t,j;
char a[100000];
scanf("%d",&t);
 while(t--)
 {   
    int sum=0,rev=0,i=0,l;
    scanf("%s",a); 
    l=strlen(a);
    for(i=0;a[i]!='\0';i++) 
    {
          if (isdigit(a[i])){
             while(a[i] != '\0' && isdigit(a[i])){ // this line needs check as well
               rev = rev *10 + (a[i]-48);
               i++;
             }
          }

        if(a[i] == '\0') i--; // to correctly map the last index in the for loop condition
        sum+=rev;
        rev=0;        
    }
    printf("%d\n",sum);
 }
    return 0;
}

答案 1 :(得分:2)

我将在字符串上向后循环。没有嵌套循环。向左移动时,只需取10s的指数

您具有字符串的长度,因此应该没有理由自己检查NUL字符

(未经测试的代码,但显示了总体思路)

https://www.amazon.com/ap/oa?client_id=YOUR_LWA_CLIENT_ID&scope=cpc_advertising:campaign_management&response_type=code&redirect_uri=YOUR_RETURN_URL

其他解决方案包括使用正则表达式将字符串拆分为所有非数字字符,然后循环并求和所有数字

答案 2 :(得分:0)

其他答案指出了正确的循环条件,以确保程序正确运行。

如果允许您使用isdigit以外的库函数,建议您将strtolEndPtr参数一起使用(输出参数指向导致{ {1}}停止扫描号码):

strtol