我正在解决这个问题:
给出一个包含字母数字字符的字符串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
答案 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
以外的库函数,建议您将strtol
与EndPtr
参数一起使用(输出参数指向导致{ {1}}停止扫描号码):
strtol