日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

边界测试——让BUG现形

發(fā)布時(shí)間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 边界测试——让BUG现形 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:寫一個(gè)函數(shù),輸入一行字符,將此字符串中最長(zhǎng)的單詞輸出。

#include <stdio.h>

#include <string.h>

int main()

{int alphabetic(char);

int longest(char []);

int i;

char line[100];

printf("input one line:\n");

gets(line);

printf("The longest word is:");

for(i=longest(line);alphabetic(line[i]);i++)

printf("%c",line[i]);

printf("\n");

return 0;

}



int alphabetic(char c)

{

if((c>='a'&&c<='z')||(c>='A'&&c<='z'))

return(1);

else

return(0);

}



int longest(char string[])

{int len=0,i,length=0,flag=1,place=0,point;

for(i=0;i<=strlen(string);i++)

if(alphabetic(string[i]))

if(flag)

{point=i;

flag=0;

}

else

len++;

else

{flag=1;

if(len>=length)

{length=len;

place=point;

len=0;

}

}

return(place);

}

  運(yùn)行結(jié)果:

  input a line:?????????????
I am a student.???????????
The longest word is : student

  題目要求“寫一個(gè)函數(shù),輸入一行字符,將此字符串中最長(zhǎng)的單詞輸出”,可是無(wú)論alphabetic()還是longest()函數(shù)都沒(méi)有實(shí)現(xiàn)“輸入一行字符,將此字符串中最長(zhǎng)的單詞輸出”這個(gè)功能要求。疑惑很久,發(fā)現(xiàn)實(shí)現(xiàn)這個(gè)功能的函數(shù)居然是main()。這就難免讓人貽笑大方了。因?yàn)榘凑粘R?guī)的慣例,要求寫一個(gè)函數(shù)實(shí)現(xiàn)某個(gè)功能,從來(lái)不是要求寫main(),盡管不能說(shuō)main()不是“一個(gè)函數(shù)”。然而如果是要求main()完成的事情,通常是作為一個(gè)完整的問(wèn)題提出的,不會(huì)提出“寫一個(gè)函數(shù)”這樣的要求。如果硬要狡辯“寫一個(gè)函數(shù)”也不排除是寫main(),就牽強(qiáng)的近乎強(qiáng)詞奪理了。不過(guò)設(shè)若真的有人如此嘴硬,你還真拿他沒(méi)什么辦法。

  既然是不見(jiàn)棺材不掉淚,那就不妨繼續(xù)往下看。

  在代碼中一眼瞄見(jiàn)了flag這個(gè)變量。經(jīng)驗(yàn)表明,凡是有這個(gè)flag變量的代碼,80%以上都是垃圾代碼。道理很簡(jiǎn)單:首先,多數(shù)問(wèn)題根本不需要設(shè)置這個(gè)別別扭扭標(biāo)志變量,只有那些善于把自己的思維扭曲得如同爛麻花一樣的人才喜歡時(shí)不時(shí)地祭出flag這個(gè)破爛的法寶。其次,即使需要設(shè)置標(biāo)準(zhǔn)變量,優(yōu)秀的代碼作者也不會(huì)使用這個(gè)含義模糊不清的名字作為標(biāo)志變量名,而會(huì)用一個(gè)更貼切、意義更明確恰當(dāng)更適合描述問(wèn)題的名字。所以,一般來(lái)說(shuō),flag往往反映了代碼的垃圾度。


  對(duì)于垃圾代碼,沒(méi)必要進(jìn)行過(guò)于細(xì)致的分析,只要指出錯(cuò)誤即可。不要試圖了解這種代碼的思路,因?yàn)檫@種代碼的思路本來(lái)就是錯(cuò)亂不堪的,就如同不要試圖理解瘋子的胡言亂語(yǔ)一樣。不要試圖修繕一座胡亂搭建起來(lái)的破爛不堪的危房,推倒重來(lái)才是明智的選擇。

  然而,找出程序的漏洞或錯(cuò)誤,往往比完成程序要難得多。而且越是垃圾的代碼越難查錯(cuò),因?yàn)槔a往往也不具備良好的可測(cè)試性。

  但是對(duì)付這種可測(cè)試性極差的垃圾代碼,有一些簡(jiǎn)單的辦法往往非常容易奏效,比如邊界檢查。訓(xùn)練有素的程序員通常都特別注意邊界,無(wú)論是寫代碼時(shí)還是檢查代碼時(shí)。因?yàn)樗麄冎肋@里非常容易出錯(cuò),而且往往失之毫厘謬之千里。但垃圾代碼的作者,由于代碼是東拼西補(bǔ)、胡亂拼湊而成的,所以往往顧不上或考慮不到這些,因此垃圾代碼很容易被“邊界檢查”這把小刀輕而易舉地戳破。以alphabetic()函數(shù)為例,只要簡(jiǎn)單地考察一下其中if語(yǔ)句所要求的表達(dá)式——(c>='a'&&c<='z')||(c>='A'&&c<='z'),就不難發(fā)現(xiàn)c<='z'這個(gè)子表達(dá)式是c<='Z'之誤。這樣就充分說(shuō)明原代碼中存在著BUG。

  順便說(shuō)一下,alphabetic()函數(shù)中的if-else語(yǔ)句用得非常愚蠢,因?yàn)?c>='a'&&c<='z') || (c>='A'&&c<='Z')這個(gè)表達(dá)式的值本身就只能為0或1,所以直接返回這個(gè)表達(dá)式的值就可以了。壓根用不著脫褲子放屁地寫一個(gè)if-else語(yǔ)句。

int?alphabetic(char?c)
{
???return???(c>='a'&&c<='z')?
????????||? (c>='A'&&c<='Z');
}

  或許,有人會(huì)認(rèn)為這是一個(gè)簡(jiǎn)單的筆誤或印刷錯(cuò)誤,修正了這個(gè)錯(cuò)誤原來(lái)的代碼是正確的。那么好吧,下面改正這個(gè)錯(cuò)誤后再來(lái)運(yùn)用一次簡(jiǎn)單的邊界測(cè)試。

  由于問(wèn)題要求輸出一行字符中最長(zhǎng)的單詞,而一行字符中可能有0個(gè)單詞、1個(gè)單詞、2個(gè)單詞……。注意,這里0個(gè)單詞的情況就是一種邊界情況,運(yùn)行這個(gè)程序并輸入0個(gè)單詞(輸入一行不含任何字母的字符,因?yàn)榇a作者把連續(xù)的若干字母字符作為一個(gè)單詞),后果居然是——運(yùn)行時(shí)程序崩潰了。這個(gè)結(jié)果絕對(duì)可以充分說(shuō)明原來(lái)的代碼是錯(cuò)誤的。

  這個(gè)結(jié)果是如何產(chǎn)生的呢?只要在紙上走查一遍,就不難發(fā)現(xiàn),輸入一行不含任何字母的字符時(shí),longest()函數(shù)中嵌套在for語(yǔ)句內(nèi)部的if語(yǔ)句將毫無(wú)意義地反復(fù)執(zhí)行

{flag=1;
if(len>=length)
{length=len;
place=point;
len=0;
}
}

  部分,而其中的賦值給place的point卻居然是一個(gè)不確定的垃圾值。

  應(yīng)該如何正確地給出這個(gè)問(wèn)題的代碼呢?正確解決問(wèn)題的前提是正確地提出問(wèn)題。原來(lái)問(wèn)題的提法本身就有很多不正確或不嚴(yán)謹(jǐn)?shù)牡胤健@?#xff0c;“將此字符串中最長(zhǎng)的單詞輸出”,這個(gè)要求本身就是似是而非很不明確的。比如,字符串中有兩個(gè)單詞長(zhǎng)度相同且都長(zhǎng)于其他單詞,究竟應(yīng)該輸出這兩個(gè)單詞中的任何一個(gè)還是需要同時(shí)輸出這兩個(gè)單詞?再有,要求函數(shù)“輸入一行字符”也非常無(wú)聊。為了能正確地解決問(wèn)題,有必要對(duì)原問(wèn)題的錯(cuò)誤要求進(jìn)行如下更正:

  寫一個(gè)函數(shù),輸出字符串中的任一長(zhǎng)度最長(zhǎng)的單詞。這里所謂的單詞,是指不含空白字符的連續(xù)字符序列。

#include <stdio.h>??
???
void print_a_longestword ( const char [] ) ;??
int? be_white? ( const char )? ;??
int? find_begin( char const [] , unsigned ) ;??
int? find_end? ( char const [] , unsigned ) ;??
void output??? ( char const [] , unsigned , unsigned ) ;??
???
int main( void )??
{??
?? printf("%s中一最長(zhǎng)單詞為:","");??????????? //測(cè)試""???
?? print_a_longestword("");??
??????
?? printf("%s中一最長(zhǎng)單詞為:"," \n\t ");????? //測(cè)試" \n\t "??
?? print_a_longestword(" \n\t ");??
???
?? printf("%s中一最長(zhǎng)單詞為:"," abc ");?????? //測(cè)試" abc "??
?? print_a_longestword(" abc ");??
???
?? printf("%s中一最長(zhǎng)單詞為:"," abc \tabcd? "); //測(cè)試" abc \tabcd? "??
?? print_a_longestword(" abc \tabcd? ");??
?????????
?? return 0;??
}??
???
void output( char const str[] , unsigned from , unsigned to )??
{??
?? while(from < to)??
????? putchar(str[from ++]);??
?? putchar('\n');?????
}??
???
int find_end (? const char str[] , unsigned from )??
{??
????? while( str[from]!='\0' && ! be_white( str[from] ) )??
???????? from ++ ;??
????? return from ;?????
}??
???
int find_begin (? const char str[] , unsigned from )??
{??
????? while( be_white( str[from] ) )??
???????? from ++ ;??
????? return from ;?????
}??
???
int be_white( const char c )??
{??
?? return?????? c == ' '??? ||??
???????????? c == '\t'? ||??
???????????? c == '\n'? ;??
}??
???
void print_a_longestword ( char const line[] )??
{??
?? unsigned site = 0U ;?????
?? unsigned begin_longest , end_longest ;??
?? begin_longest = end_longest = site??? ;??
??????
?? do{??
????? int this_begin , this_end? ;??
?????????
????? site = this_begin = find_begin ( line , site )??? ;//單詞開(kāi)頭???
????? site = this_end? = find_end?? ( line , site )???? ;//單詞結(jié)尾????????
???
????? if(?? ( this_end??? - this_begin )???
????????? > ( end_longest - begin_longest ) ){??
???????? begin_longest = this_begin ;??
???????? end_longest?? = this_end?? ;???????
????? }???????
???
?? }while( line[ site ] != '\0') ;?????
???
?? output( line , begin_longest , end_longest );??
}

本文出自seven的測(cè)試人生公眾號(hào)最新內(nèi)容請(qǐng)見(jiàn)作者的GitHub頁(yè):http://qaseven.github.io/

總結(jié)

以上是生活随笔為你收集整理的边界测试——让BUG现形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 青青草网址 | 国产精品21p | 国产精品久久久久久久久久妞妞 | 91在线无精精品一区二区 | 最近中文字幕第一页 | 一级黄色免费大片 | 美女视频一区 | 久久久久久久久久久99 | 久久久免费高清视频 | 亚洲人吸女人奶水 | 亚洲第七页 | 本道综合精品 | 古代黄色片| 欧美a性 | www,jizz,com| 亚洲一区二区三区婷婷 | 日本少妇18p| 亚洲精品女人 | 欧美中文字幕在线视频 | 中文字幕1区2区3区 www.com黄色片 | 国产成人在线播放 | 亚洲天堂网一区 | 国产a一区| 色综合视频网 | 国产一区高清 | 成人欧美在线 | 亚洲逼院 | 暗呦丨小u女国产精品 | 99er热精品视频 | 国产睡熟迷奷系列精品视频 | 久久久久99| 国语对白91 | 国产男男一区二区三区 | 成人在线免费看 | 日韩av在线看免费观看 | 日韩欧美视频在线免费观看 | 中文字幕日韩精品亚洲一区小树林 | 国产午夜伦理 | 97免费在线 | 天堂欧美城网站 | 二色av | 日韩一级二级三级 | 黄色正能量网站 | 蜜桃av噜噜一区二区三区网址 | 欧美精品久久久久久久久老牛影院 | 欧美国产一区二区三区 | 国产亚洲精品久久久久动 | 精品久久久久久一区二区里番 | 男女扒开双腿猛进入爽爽免费 | 国产真人毛片 | 精彩久久| 欧美精品免费一区二区三区 | 亚洲天堂av中文字幕 | 国产又粗又大又爽 | 久久福利视频导航 | 色丁香婷婷综合久久 | 浮妇高潮喷白浆视频 | 亚洲精品一卡 | 久久久久久久久免费视频 | 国产激情小视频 | 国产一卡二卡 | 无码人妻一区二区三区线 | 夜夜视频 | 加勒比一区在线 | 波多野结衣亚洲一区二区 | 日本成人高清 | 先锋影音av资源在线观看 | 伊人三级 | 国产毛片91| 在线观看福利片 | 中文字幕一区二区三区又粗 | 成人免费毛片男人用品 | 视频免费在线观看 | 亚洲欧美一区二区三区在线观看 | 一本色道久久88加勒比—综合 | 欧美激情片一区二区 | 亚洲精品丝袜 | 播色网 | 一区二区三区免费在线 | 美女扒开屁股让男人捅 | 成人午夜视频在线观看 | 国产高清一区在线 | 亚洲天堂男人av | 国产wwwwww | 少妇精品视频一区二区 | 色www. | 国产乱淫av片 | 亚洲精品久久久久中文字幕二区 | 国产精品91视频 | 噜噜啪啪| 久久免费福利 | 91影院在线播放 | 色悠悠网址 | 久久久精品区 | 99久久网站| 久久亚洲精品石原莉奈 | 牛牛视频在线观看 | 国产精品分类 | 国产原创视频 |