加壹個break跳出循環即可。
#include?<stdio.h>#include?<string.h>
int?main(void)
{
char?y[4000]/*原文本*/,b[3999*4/3]/*待解的Base64碼*/,mb[64]/*Base64碼表*/;
int?i,j/*i,j為兩個計數用的變量*/,zu/*將待解的Base64碼分成4個字符壹組,zu用於記錄第幾組*/;
for?(i=0;i<26;++i)?mb[i]=i+65;
for?(i=0;i<26;++i)?mb[i+26]=i+97;
for?(i=0;i<10;++i)?mb[i+52]=i+48;
mb[62]='+';
mb[63]='/';/*對碼表賦值*/
for(i=0;i<4000;++i)?y[i]=0;
for?(i=0;i<3999*4/3;b[i++]=0);/*清空兩個字符串*/
fgets(b,3999*4/3-1,stdin);/*輸入Base64碼*/
for?(i=0;i<strlen(b)-1;++i)/*處理b中的每個字符*/
for?(j=0;j<64;++j)?
if?(mb[j]==b[i])?
{
b[i]=j; /*尋找各字符對應的碼表序號,貌似就是這裏出的問題*/
break;?/*壹找到就跳出,可避免重復比較。沒有這句會重復比較到最後,如果j的值剛好落在字符數字的ASCII碼中,會引起的重復的給b[i]賦值*/
}
for?(zu=0;zu<(strlen(b)-1)/4;++zu)/*Base64解碼*/
{
y[zu*3+0]=((b[zu*4+0]<<2))|(b[zu*4+1]>>4);
y[zu*3+1]=((b[zu*4+1]<<4))|(b[zu*4+2]>>2);
y[zu*3+2]=((b[zu*4+2]<<6))|b[zu*4+3];
}
printf("%s\n",y);/*輸出原文本*/
return?0;
}