21天C語言代碼訓(xùn)練營(第十七天)

在后面的五篇中,我們開始重點介紹一些C語言編程中的技巧和常見的錯誤伟恶。這些會對大家今后的面試和工作起到一些積極的作用宵晚。

1. 特殊比較

在程序設(shè)計中,很常見的一個問題是變量與零值的比較問題筋讨。很多資深程序員還經(jīng)常在這個問題上犯錯。

1.1 float類型與零值比較

也許大家不假思索就會寫出這樣的代碼:

float x;
...
if (x == 0.0) 
if (x != 0.0) 

如果你面試的時候?qū)懗鲞@樣的代碼摸恍,很遺憾你沒被錄取悉罕。一段簡單的代碼就能說明這種寫法有什么問題:

#include <stdio.h>

int main()
{
    float b = 0.01;
    float x = b - 0.01;

    if (x == 0.0)
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }

    return 0;
}

我們看一下這段代碼的執(zhí)行結(jié)果:

代碼執(zhí)行結(jié)果

看了執(zhí)行結(jié)果,也許你會很奇怪立镶。為什么打印的結(jié)果不是Yes呢壁袄?其實,在內(nèi)存中保存0.01這樣一個數(shù)字時媚媒,計算機其實保存的數(shù)字是0.00999999978嗜逻。因此,在執(zhí)行b - 0.01這句代碼時結(jié)果并不是0而是2.23517413e-10缭召。具體原因我們就不在這里討論了栈顷。那正確的寫法究竟是什么呢逆日?正確的寫法如下:

#include <stdio.h>

#define EPSINON 0.00001

int main()
{
    float b = 0.01;
    float x = b - 0.01;

    if ((x >= -EPSINON) && (x <= EPSINON))
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }

    printf("\n");
    return 0;
}

這樣寫通過一個精確范圍來界定x變量是否為0。

1.2 空字符串判斷

前些天組里還有位資深程序員寫出了類似下面的代碼萄凤,大家覺得有什么問題室抽。

int main()
{
    char* pch = (char*)malloc(5 * sizeof(char));
    pch[0] = 0;

    if (pch == "")
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }

    return 0;
}

寫這段代碼的人認為通過pch[0] = 0這句話把pch變成了一個空字符串,之后在pch == ""這句判斷語句執(zhí)行時結(jié)果應(yīng)該為真靡努。因此坪圾,應(yīng)該打印"Yes",結(jié)果打印的卻是"No"惑朦。

原因其實很簡單兽泄,pch == ""這句話其實比較的是pch指針和“”這個空字串地址。兩個不同的地址比較結(jié)果跟保存內(nèi)容其實沒有任何關(guān)系漾月。正確的寫法應(yīng)該是這樣:

int main()
{
    char* pch = (char*)malloc(5 * sizeof(char));
    pch[0] = 0;

    if (strcmp(pch, "") == 0)
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }

    return 0;
}

C語言庫函數(shù)中為大家提供了strcmp這么一個無比好用的函數(shù)病梢,那么一定要學(xué)會正確使用它。

2. 變量的內(nèi)存空間

在C語言程序設(shè)計中栅屏,經(jīng)常需要關(guān)注變量在內(nèi)存中的狀態(tài)飘千。其中,非常重要的是占用內(nèi)存的大小栈雳。常用sizeof()這個函數(shù)來得到占用內(nèi)存的大小。先看一段代碼:

#include <stdio.h>

int main()
{
    char str[] = "Hello";
    char *p = str;
    int n = 10;

    int a = sizeof(str);
    int b = sizeof(p);
    int c = sizeof(n);

    printf("%d\n", a);
    printf("%d\n", b);
    printf("%d\n", c);

    return 0;
}

你能正確說出這段代碼的執(zhí)行結(jié)果嗎缔莲?如下圖:

執(zhí)行結(jié)果

讓很多人比較疑惑的是變量b的值為什么是4哥纫。如果你仔細看了之前的文章,那么肯定知道它表示的是指針變量在內(nèi)存中的大小痴奏。

3. strcpy函數(shù)實現(xiàn)

接下來蛀骇,我們通過這個函數(shù)的實現(xiàn)來介紹幾個筆試中常見的問題。

char* strcpy(char* strDest, const char* strSrc);

3.1. 不調(diào)用C語言庫函數(shù)读拆,編寫strcpy函數(shù)

在我的印象中擅憔,遇到過很多次這樣的題目。難度稍高一些的嵌入式開發(fā)題目要求用效率最高的方式實現(xiàn)檐晕。正確代碼如下:

char* strcpy(char* strDest, const char* strSrc)
{
    assert((strDest != NULL) && (strSrc != NULL));
    char* address = strDest;
    while ((*strDest++ = *strSrc++) != '\0')
        NULL;
    return address;
}

這種寫法應(yīng)該已經(jīng)非常接近庫函數(shù)的實現(xiàn)方法了暑诸,它的效率非常高。

3.2. strcpy能夠把strSrc的內(nèi)容復(fù)制給strDest辟灰,為什么需要char*類型的返回值个榕?

這個問題其實沒有唯一答案,你可以談自己對程序設(shè)計的理解芥喇,并給出一個你覺得合適的答案西采。這里給出一個大多數(shù)面試官比較喜歡的答案:

這樣設(shè)計能夠?qū)崿F(xiàn)鏈式表達式,如:
int len = strlen(strcpy(strDest, "ABCDE"));

3.3. const char* strSrc中const的意義继控?

其實const這個關(guān)鍵字嚴格意義上說是C++中的械馆,但越來越多的C語言代碼開始使用這個關(guān)鍵字胖眷。它的意義是保證strSrc這個字符串的內(nèi)容不會被strcpy修改。

今天就先到這里霹崎,有什么問題歡迎郵件溝通瘦材。

我是天花板,讓我們一起在軟件開發(fā)中自我迭代仿畸。
如有任何問題食棕,歡迎與我聯(lián)系。


上一篇:21天C語言代碼訓(xùn)練營(第十六天)
下一篇:21天C語言代碼訓(xùn)練營(第十八天)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末错沽,一起剝皮案震驚了整個濱河市簿晓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌千埃,老刑警劉巖憔儿,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異放可,居然都是意外死亡谒臼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門耀里,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈缤,“玉大人,你說我怎么就攤上這事冯挎〉赘纾” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵房官,是天一觀的道長趾徽。 經(jīng)常有香客問我,道長翰守,這世上最難降的妖魔是什么孵奶? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蜡峰,結(jié)果婚禮上了袁,老公的妹妹穿的比我還像新娘。我一直安慰自己事示,他們只是感情好早像,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肖爵,像睡著了一般卢鹦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天冀自,我揣著相機與錄音揉稚,去河邊找鬼。 笑死熬粗,一個胖子當著我的面吹牛搀玖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驻呐,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼灌诅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了含末?” 一聲冷哼從身側(cè)響起猜拾,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佣盒,沒想到半個月后挎袜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肥惭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年盯仪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜葱。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡全景,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笼沥,到底是詐尸還是另有隱情蚪燕,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布奔浅,位于F島的核電站,受9級特大地震影響诗良,放射性物質(zhì)發(fā)生泄漏汹桦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一鉴裹、第九天 我趴在偏房一處隱蔽的房頂上張望舞骆。 院中可真熱鬧,春花似錦径荔、人聲如沸督禽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狈惫。三九已至,卻和暖如春鹦马,著一層夾襖步出監(jiān)牢的瞬間胧谈,已是汗流浹背忆肾。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菱肖,地道東北人客冈。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像稳强,于是被迫代替她去往敵國和親场仲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 史上最全的iOS面試題及答案 迷途的羔羊--專為路癡量身打造的品牌退疫。史上最精準的定位渠缕。想迷路都難!閃電更新中......
    南虞閱讀 1,500評論 0 8
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,966評論 0 7
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,712評論 0 4
  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用蹄咖,...
    LZM輪回閱讀 3,291評論 0 6
  • 凌晨一點 外面雨聲滴滴滴滴地響 大概是雨水與雨水在碰撞 夜很黑 手機屏調(diào)到最暗 仍然閃著稍刺眼的光 還有本該刺耳的...
    甘野閱讀 361評論 0 3