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