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

C 计算字符串中所有数字的总和,c,arrays,string,algorithm,C,Arrays,String,Algorithm,我正在解决这个问题: 给定包含字母数字字符的字符串str,计算总和 字符串中存在的所有数字的 输入: 输入的第一行包含一个整数T,表示测试用例的数量。然后T检验 案件接踵而至。每个测试用例都包含一个包含字母数字字符的字符串 输出: 打印字符串中所有数字的总和 限制条件: 1如果您希望在for循环条件中更改while循环中的逻辑,那么您也必须更改while循环中的逻辑,因为很可能字符串的末尾也存在数字,比如在一个输入1abc2x30yz67中。因此,正确的代码如下所示: 片段: 在进一步检查时,您

我正在解决这个问题:

给定包含字母数字字符的字符串str,计算总和 字符串中存在的所有数字的

输入:

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

输出:

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

限制条件:


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

片段:

在进一步检查时,您还需要while循环条件中的i
while(i < l && isdigit(a[i])){
更新3:

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

#include <stdio.h>
#include <string.h>
int main() {
    //code
int t,j;
char a[100005];
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])){
         rev = rev * 10 + (a[i]-48);
      }else{
        sum += rev;
        rev = 0;
      }
    }
    printf("%d\n",sum + rev); // to also add last rev we captured
 }
    return 0;
}

如果您希望在for循环条件中更改while循环中的逻辑,那么您也必须更改while循环中的逻辑,因为很可能数字也存在于字符串的末尾,就像在一个输入1abc2x30yz67中一样。因此,正确的代码如下所示:

片段:

在进一步检查时,您还需要while循环条件中的i
while(i < l && isdigit(a[i])){
更新3:

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

#include <stdio.h>
#include <string.h>
int main() {
    //code
int t,j;
char a[100005];
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])){
         rev = rev * 10 + (a[i]-48);
      }else{
        sum += rev;
        rev = 0;
      }
    }
    printf("%d\n",sum + rev); // to also add last rev we captured
 }
    return 0;
}

我会在绳子上倒扣。没有嵌套循环。向左移动时,只需取10s指数

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

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

#include <math.h>


l=strlen(a);
int exp; 
exp = 0;
for(i = l-1; i >= 0; i--) 
{
      if (isdigit(a[i])) {
           rev = a[i]-48;  // there are better ways to parse characters to int 
           rev = (int) pow(10, exp) * rev;
           sum += rev;  // only add when you see a digit 
      } else { exp = -1; } // reset back to 10^0 = 1 on next loop 

    exp++;
}

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

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

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

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

#include <math.h>


l=strlen(a);
int exp; 
exp = 0;
for(i = l-1; i >= 0; i--) 
{
      if (isdigit(a[i])) {
           rev = a[i]-48;  // there are better ways to parse characters to int 
           rev = (int) pow(10, exp) * rev;
           sum += rev;  // only add when you see a digit 
      } else { exp = -1; } // reset back to 10^0 = 1 on next loop 

    exp++;
}

其他解决方案包括使用正则表达式拆分所有非数字字符上的字符串,然后对所有数字进行循环和求和

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

如果允许使用isdigit以外的库函数,我建议将strtol与EndPtr参数output参数一起使用,该参数指向导致strtol停止扫描数字的字符串中的字符:

char str[] = "1abc23def5678ikl";

int main()
{
    char *pStop = str;
    int n, accum = 0;
    size_t len = strlen(str);

    do
    {
        n = strtol(pStop, &pStop, 10);
        pStop++;
        if(n)
        {
            printf("%d\n", n);
            accum += n;
        }
    }
    while(pStop < &str[len]);

    printf("Total read: %d\n", accum);

    return 0;
}

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

如果允许使用isdigit以外的库函数,我建议将strtol与EndPtr参数output参数一起使用,该参数指向导致strtol停止扫描数字的字符串中的字符:

char str[] = "1abc23def5678ikl";

int main()
{
    char *pStop = str;
    int n, accum = 0;
    size_t len = strlen(str);

    do
    {
        n = strtol(pStop, &pStop, 10);
        pStop++;
        if(n)
        {
            printf("%d\n", n);
            accum += n;
        }
    }
    while(pStop < &str[len]);

    printf("Total read: %d\n", accum);

    return 0;
}


我也不明白字符串末尾的数字是什么意思。字符串末尾的数字将成为字符串的一部分,之后只有我们有'\0'。另外,我刚刚添加了提到的条件,但它仍然不起作用。@Laveena它仍然不起作用。你能分享一个演示链接吗?我猜你忘了添加一个[I]!='\0'在上面的第一个链接中。我正在解决一个关于Geeksforgeks的问题,因此有许多测试用例的代码可能会失败。所以我在这里提供链接,你可以在那里检查你的代码。谢谢。@Lavena更新了我的答案。@Lavena是的,是一个分段错误。我也不明白字符串末尾的数字是什么意思。字符串末尾的数字将成为字符串的一部分,之后只有我们有'\0'。另外,我刚刚添加了提到的条件,但它仍然不起作用。@Laveena它仍然不起作用。你能分享一个演示链接吗?我猜你忘了添加一个[I]!='\0'在上面的第一个链接中。我正在解决一个关于Geeksforgeks的问题,因此有许多测试用例的代码可能会失败。所以我在这里提供链接,你可以在那里检查你的代码。谢谢。@Lavena更新了我的答案。@Lavena是的,是分段错误。为什么要使用while循环并手动增加for循环内的循环计数器?我没有理解。这就是我需要它来解决问题的方式。不,你需要找到一个总数。While循环不是必需的为什么要使用While循环并手动增加for循环中的循环计数器?我没有理解。这就是我需要它来解决问题的方式。不,你需要找到一个总数。虽然循环不是必需的,谢谢!那太好了。我想知道哪些更好的方法可以将字符解析为int,而且我仍然不清楚为什么上面提到的代码不起作用。所以,如果你能帮上忙,我会很高兴的。参考标准库中的strtol函数,你也可以从前到后移动以避免循环。还有,我不应该从l-1一直到0吗?@vivek这样追踪十个位置比较困难。谢谢,这里有更好的方法来解析int字符,注意如果[i]已经是kno
wn作为一个数字,[i]-“0”保证给出它的值,无论使用的字符集是什么。谢谢!那太好了。我想知道哪些更好的方法可以将字符解析为int,而且我仍然不清楚为什么上面提到的代码不起作用。所以,如果你能帮上忙,我会很高兴的。参考标准库中的strtol函数,你也可以从前到后移动以避免循环。还有,我不应该从l-1一直到0吗?@vivek这样追踪十个位置比较困难。谢谢,还有更好的方法将字符解析为int。请注意,如果已知[i]是一个数字,[i]-“0”保证给出它的值,无论使用的字符集是什么。
char str[] = "1abc23def5678ikl";

int main()
{
    char *pStop = str;
    int n, accum = 0;
    size_t len = strlen(str);

    do
    {
        n = strtol(pStop, &pStop, 10);
        pStop++;
        if(n)
        {
            printf("%d\n", n);
            accum += n;
        }
    }
    while(pStop < &str[len]);

    printf("Total read: %d\n", accum);

    return 0;
}