Вам также придется изменить логи c в вашем времени l oop, если вы хотите изменить sh в вашем состоянии для l oop, поскольку вполне возможно, что число существует в конце Строка также, как в одном из ваших входных данных 1abc2x30yz67
. Таким образом, правильный код будет выглядеть так:
Фрагмент:
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;
}
При дальнейшей проверке вам необходимо условие i в любом случае в вашем состоянии l oop.
while(i < l && isdigit(a[i])){
Обновление № 1:
Точнее, l oop while(isdigit(a[i])){
сохраняет идти до конца строки. Хотя это не вызывает проблем в самом l oop, потому что \0
не является di git, но a[i] != '\0'
в условии for l oop позволяет вам получить доступ к чему-либо за пределами длины строки потому что мы продвигаемся еще на 1 позицию из-за i++
в for для l oop, тогда как мы уже достигли конца строки во внутренней части, в то время как l oop.
Update # 2:
Вам также нужна дополнительная проверка a[i] == '\0'
для уменьшения i
.
#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;
}
Обновление № 3:
Вы можете полностью избежать пока l oop, как показано ниже:
#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;
}