標題:

C語言一題 誰能教我如何修改?

abc mart發問:

#include#include#include struct ip_addr{ char dd[16]; unsigned char bin[4]; };int dd_to_bin(struct ip_addr*p){ char a[16]; int i=0,j=0,f[4],l=0; for(i=0;i<16;i++){ ... 顯示更多 #include #include #include struct ip_addr{ char dd[16]; unsigned char bin[4]; }; int dd_to_bin(struct ip_addr*p){ char a[16]; int i=0,j=0,f[4],l=0; for(i=0;i<16;i++){ if((*p).dd[i]=='.'){ f[j] = atoi((*p).dd); j++; } } for(l=0;l<4;l++){ (*p).bin[l] = f[l]; } } int ip_net_id(struct ip_addr daddr,struct ip_addr sbmsk,struct ip_addr *netidp){ unsigned char a[4]; int i,j; for(i=0;i<4;i++){ a[i] = (daddr.bin[i] & sbmsk.bin[i]); } for(j=0;j<4;j++){ (*netidp).bin[j] = a[j]; } } int bin_to_dd(struct ip_addr*p){ unsigned char b[4]; int i,j=0; for(i=0;i<4;i++){ (*p).bin[i] =(*p).dd[i]; } } int main() { ip_addr my_addr,submask,my_netid; printf("請輸入IP位址:"); scanf("%c",&my_addr.dd); dd_to_bin(&my_addr.dd); printf("請輸入Subnet Mask:"); scanf("%c",submask.dd); dd_to_bin(&submask.dd); ip_net_id(my_addr,submask,&my_netid); bin_to_dd(&my_netid.bin); printf("%c",my_netid.dd); system("pause"); } 我是用Dev C++ 寫的 他一直說主程式裡 dd_to_bin(&my_addr.dd); dd_to_bin(&submask.dd); bin_to_dd(&my_netid.bin); 這三行有問題 請高手替我解答 我很弱看不出哪裡出問題=.= 順便請教 bin_to_dd 的那個函數 怎麼寫可以把 " . " 也一起printf出來

夜空中最亮的星 吉他譜翻譯 社 高雄 市最佳解答:

正如 意見001 M大所言, 是dd_to_bin() 與 bin_to_dd() 參數給錯了. 我不是高手, 我改了程式並補上註解供參考... #include #include struct ip_addr{ char dd[16]; // IP字串 unsigned char bin[4]; // IP值 }; // 將IP字串轉IP值 int dd_to_bin(struct ip_addr *p){ int i, b, n; for(i=b=n=0; b<4 && p->dd[i]!=0; ++i){ if(p->dd[i]>='0' && p->dd[i]<='9'){ // 計算為值.. p->bin[b] = n = n*10 + (p->dd[i]&0x0F); if (n>255) return -2; // IP內值不能大於255 } else if (p->dd[i]!='.') return -1; //只限輸入 '0'~'9' 與 '.' else if (++b<4) p->bin[b]=n=0; } while (++b<4) p->bin[b]=0; //將不足的IP內值設為0 return 1; } // IP值運算(遮罩) void ip_net_id(struct ip_addr daddr,struct ip_addr sbmsk,struct ip_addr *netidp){ int b; for(b=0;b<4;b++){ netidp->bin[b] = (daddr.bin[b] & sbmsk.bin[b]); } } // 將IP值轉IP字串 void bin_to_dd(struct ip_addr *p){ int i, b, n; for(b=0, i=0; b<4; ++b){ n = p->bin[b]; // 取IP值 if (n/100) p->dd[i++] = '0'+ n/100; //若有百位數 if (n/10) p->dd[i++] = '0'+ n/10%10; //若有十位數 p->dd[i++] = '0' + n%10; //個位數 if (b<3) p->dd[i++] = '.'; //IP字串間以'.'間隔 } p->dd[i++] = 0; //字串結尾 } //==== 主程式 int main() { struct ip_addr my_addr, submask, my_netid; do { fflush(stdin); printf(" 請輸入IP位址:"); }while (scanf( "%s", my_addr.dd)!=1 || dd_to_bin(&my_addr)<0); do { fflush(stdin); printf(" 請輸入Subnet Mask:"); }while(scanf( "%s", submask.dd)!=1 || dd_to_bin(&submask)<0); ip_net_id( my_addr, submask, &my_netid); bin_to_dd(&my_netid); printf(" NetId: %s ", my_netid.dd); system("pause"); return 0; } 我比較不喜歡這種大括號不齊頭的寫法(@@), 不過還是照版大的風格來讓程式碼維持一致性囉~~

其他解答:

int dd_to_bin(struct ip_addr*p ....要的是結構的 address 你call它時是, dd_to_bin(&my_addr.dd); 元素內的 address 先不管你程式(我沒看) 先將 dd_to_bin(&my_addr.dd); 改成 dd_to_bin(&my_addr);6BD45AA720B3A9F1
arrow
arrow

    jookqjony3w8 發表在 痞客邦 留言(0) 人氣()