身份证号码验证,程序过了但是有几个问题

#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