计算分子式,刚开始忘了某一种元素个数大于10的情况,不过很容易就发现了bug,再后来一个比较隐蔽的bug就是 memset(num,'\0',sizeof(num)) 的位置放的不正确,导致前一次运算结果对 下一次结果产生了影响, 应有意识去避免这种错误。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
int c,h,o,n,m,l,i,j,k,r,s,t,sum;
char a[100],num[100];
double zhiliang;
scanf("%d",&m);
for(k=1; k<=m; k++)
{
c=0; h=0; o=0; n=0; s=0; sum=0;
scanf("%s",a);
l=strlen(a);
for(i=0; i<l; i++)
{
memset(num,'\0',sizeof(num));
r=0;
if(a[i]=='C')
{
if(a[i+1] == '\0' || a[i+1] == 'C' || a[i+1] == 'H' ||a[i+1] == 'O' ||a[i+1] == 'N' )
c++;
while ( a[i+1]>=49 && a[i+1]<=57 )
{
num[r++]=a[i+1];
i++;
}
c=c+atoi(num);
}
if(a[i]=='H')
{
if(a[i+1] == '\0' || a[i+1] == 'C' || a[i+1] == 'H' ||a[i+1] == 'O' ||a[i+1] == 'N' )
h++;
while ( a[i+1]>=49 && a[i+1]<=57 )
{
num[r++]=a[i+1];
i++;
}
h=h+atoi(num);
}
if(a[i]=='O')
{
if(a[i+1] == '\0' || a[i+1] == 'C' || a[i+1] == 'H' ||a[i+1] == 'O' ||a[i+1] == 'N' )
o++;
while ( a[i+1]>=49 && a[i+1]<=57 )
{
num[r++]=a[i+1];
i++;
}
o=o+atoi(num);
}
if(a[i]=='N')
{
if(a[i+1] == '\0' || a[i+1] == 'C' || a[i+1] == 'H' ||a[i+1] == 'O' ||a[i+1] == 'N' )
n++;
while ( a[i+1]>=49 && a[i+1]<=57 )
{
num[r++]=a[i+1];
i++;
}
n=n+atoi(num);
}
}
zhiliang=12.01*c+1.008*h+16.00*o+14.01*n;
printf("%.3lf\n",zhiliang);
}
return 0;
}