#include<stdio.h>
int main()
{
int i=0;
int n=18;
int qz[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
char sfz[18];
int sum=0;
int sum1=0;
int gjr=0;
int N=0;
int m=0;
int q=0;
scanf("%d",&N);
for(i=0;i<N;i++)
{
for(m=0;m<19;m++)
{
scanf("%c",&sfz[m]);
}
sum=0;
for(q=1;q<19;q++)
{
if(sfz[18]=='X'||sfz[18]=='x')
{
sfz[18]='9'+1;
}
gjr=(sfz[q]-'0')*qz[q-1];
sum=gjr+sum;
}
if(sum%11==1)
{
sum1++;
}
}
printf("%d",sum1);
return 0;
}
如图为什么char的数组第一个字符数字是从sfz【1】录入的,然后int数组却是正常的从qz【0】开始,而且17行的循环录入条件,m怎么是小于19,按理说18就够了。。
这是几位大佬改后跑完的结果和标准结果
我的那个跑的是正常结果。。。不知道为什么
你也可以把下标设置成0啊
对下标从0开始和数组大小之间的关系有些不清晰,满大街的sfz[18]简直太刺眼了哈
#include<stdio.h>
int main()
{
int i = 0;
int qz[18] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };
char sfz[18];
int sum = 0;
int sum1 = 0;
int gjr = 0;
int N = 0;
int m = 0;
int q = 0;
scanf("%d", &N);
for (i = 0; i<N; i++)
{
for (m = 0; m<18; m++)
{
scanf("%c", &sfz[m]);
}
sum = 0;
if (sfz[17] == 'X' || sfz[17] == 'x')
{
sfz[17] = '9' + 1;
}
for (q = 0; q<18; q++)
{
gjr = (sfz[q] - '0')*qz[q];
sum = gjr + sum;
}
if (sum % 11 == 1)
{
sum1++;
}
}
printf("%d", sum1);
return 0;
}
第7行,char sfz[18]; sfz只有18个字节大小(下标最大到17),但是在17行的for循环里,用了m<19,下标可以到18,明显越界了。还有第24行,sfz[18]=='X'||sfz[18]=='x,这里直接写sfz[18]明显越界了,程序没蹦真是奇迹。
代码修改了一下,供参考。如有帮助,请帮忙点一下采纳按钮支持一下,谢谢。
#include<stdio.h>
int main()
{
int i=0;
int n=18;
int qz[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
char sfz[18];
int sum=0;
int sum1=0;
int gjr=0;
int N=0;
int m=0;
int q=0;
scanf("%d",&N);
for(i=0;i<N;i++)
{
for(m=0;m<18;m++) //修改1 : m<19 改成m<18
{
scanf("%c",&sfz[m]);
}
sum=0;
for(q=1;q<19;q++)
{
if(sfz[17]=='X'||sfz[17]=='x') //修改2:
{
sfz[17]='9'+1;
}
gjr=(sfz[q-1]-'0')*qz[q-1]; //修改3,这个地方我不明白你要实现什么功能,但是原来的sfz[q]-'0'这里sfz[q]会越界
sum=gjr+sum;
}
if(sum%11==1)
{
sum1++;
}
}
printf("%d",sum1);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632