笔试题目“检测IPv4地址”的实现
網(wǎng)友的力量是強(qiáng)大的,昨天發(fā)了一篇Post,關(guān)于一道面試/筆試題。得到網(wǎng)友們的眾多解決方法。我不得不承認(rèn)自己寫的代碼是如此的爛。盡管如此,也是很有必要和大家一起來(lái)探討,也有必要寫出自己心中所想。這樣才有進(jìn)步,才有改變,才能將自己的爛代碼優(yōu)化。接著發(fā)一段爛代碼,希望學(xué)習(xí)網(wǎng)友們更加優(yōu)美,優(yōu)秀的代碼。
筆試題目
判斷一個(gè)字符串是否是IPv4地址。如果是返回ture,否則返回false。同樣不可以使用庫(kù)函數(shù)。可以選擇用C/C++,C#或者Java。
e.g. ?C/C++: ?bool checkIPv4(char * ip){}
?
解決方法
鄙人是這樣想的,按照‘.’先將每個(gè)字串分割出來(lái)。如“192.168.203.70”分割為192,168,203,70四個(gè)整型。然后再判斷這四個(gè)整型的范圍,是否在0~255之間。我總覺(jué)得這種考慮欠妥,應(yīng)該選擇類似正則表達(dá)式那樣的方法吧。但是不會(huì)寫。。。
一開(kāi)始我是這樣寫的。
檢查IPv4 #include <stdio.h>bool checkIpv4(char * ip) {char *p=ip;char *q=ip;char *c;int i=0,s,count=0;if(*p=='.') //處理特殊情況return false;while(*p!='\0'){if(*p=='.'||*(p+1)=='\0') //根據(jù)'.'將字符串切割出來(lái) {count++; //計(jì)算切割的字串個(gè)數(shù)if(*(p+1)=='\0') //處理最后一個(gè)字串 {i++;q=p;}elseq=p-1;s=0;for(int j=1;j<=i;j++) //將切割出來(lái)的字串變成整型 {int x=*q-'0'; //字符減'0'變?yōu)檎?/span>for(int k=1;k<j;k++)x*=10;s+=x;q--;}printf("%d\n",s);if(s<0||s>255) //判斷切割出來(lái)的字串是否在ipv4范圍內(nèi)return false;i=0;}else{i++;}p++;}if(count==4)return true;elsereturn false; }int main(void) {char ip[]="a.v.0.0";if(checkIpv4(ip))printf("該地址是IPv4地址\n");elseprintf("該地址不是IPv4地址\n");return 0; }?
但是很明顯是有問(wèn)題的。
當(dāng)檢驗(yàn)“192.168.203.70”的時(shí)候,結(jié)果是可以的。
但是當(dāng)檢驗(yàn)的對(duì)象不是數(shù)字的時(shí)候,例如“a.168.203.70”,居然也可以驗(yàn)證通過(guò),欠考慮了。
所以在切割出來(lái)的每個(gè)整型,我再檢查了一遍每個(gè)整型是否在0~9范圍內(nèi),不是的話返回false。
if(x<0||x>9) //判斷x是否在0~9之間return false;感謝網(wǎng)友zdd的提醒,確實(shí)沒(méi)有考慮到類型“1...3”出現(xiàn)連續(xù)點(diǎn)的情況。果然自己寫的東西夠爛的。我是這樣處理的:
出現(xiàn)這樣的情況是因?yàn)?/p> s=0;for(int j=1;j<=i;j++) //將切割出來(lái)的字串變成整型
{int x=*q-'0'; //字符減'0'變?yōu)檎?/span>if(x<0||x>9) //判斷x是否在0~9之間return false;for(int k=1;k<j;k++) //第幾位乘以幾-1個(gè)10.x*=10;s+=x;q--;} 里面的for循環(huán)會(huì)發(fā)生不執(zhí)行的情況,所以就不處理類似“1...3”出現(xiàn)連續(xù)點(diǎn)的情況了。我改變代碼如下 將x放在for循環(huán)外面,用來(lái)檢測(cè)是否出現(xiàn)連續(xù)個(gè)點(diǎn)的情況。 ? ? ? ? 解釋應(yīng)該挺清楚的了。這個(gè)時(shí)候只要切割出來(lái)的字符不在0~9范圍內(nèi),都不會(huì)通過(guò)。 ?
以上是生活随笔為你收集整理的笔试题目“检测IPv4地址”的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
下面是完整的代碼
總結(jié)
- 上一篇: 更改SQL Server表所有者的操作方
- 下一篇: jquery-1.10.2 获取chec