欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何判斷一段字符串的長度

魚鷹談單片機 ? 來源:魚鷹談單片機 ? 2024-08-12 17:42 ? 次閱讀

來源:公眾號【魚鷹談單片機

作者:魚鷹Osprey

ID :emOsprey

這周課上介紹斷言實現(xiàn)的時候,莫名其妙被斷言的真真假假搞暈了。

起因是看到一段關(guān)于判斷一段字符串的長度,使用了 ASSERT 方式,原文大概是這樣寫的:

#define AES256_KEY                      "0123456789ABCDEF0123456789ABCDEF"  /* 必須等于 32 字節(jié) */
#define AES256_IV                       "0123456789ABCDEF"                  /* 必須等于 16 字節(jié) */
extern void Assert_Failed(uint8_t *func, uint32_t line);
#define ASSERT(expr)            ((expr) ? (void)0U : Assert_Failed((uint8_t *)__func__, __LINE__))
voidfunc()
{
  ASSERT(sizeof(AES256_KEY) != 32);
     ASSERT(sizeof(AES256_IV) != 16);
}

一開始總以為這種寫法沒問題,畢竟這么簡單,模擬調(diào)試的時候確實也不會報錯(打開了斷言情況下)。

為了課上測試一下靜態(tài)編譯報錯的效果,卻發(fā)現(xiàn)始終有些問題,不該報錯的時候報錯了。

#define STATIC_ASSERT(...)      extern char (*_do_assert(void)) [sizeof(char[1 - 2*!(__VA_ARGS__)])]

為了方便,魚鷹直接用 MDK 測試了 sizeof 字符串的結(jié)果,發(fā)現(xiàn)確實也是16(0x10)

285aa6f4-4d44-11ef-b8af-92fbcf53809c.png

然后我就困在了這兩個前提上,STATIC_ASSERT 報錯始終有問題。

#define AES256_KEY                      "0123456789ABCDEF0123456789ABCDEF"  /* 必須等于 32 字節(jié) */
#define AES256_IV                       "0123456789ABCDEF"                  /* 必須等于 16 字節(jié) */
extern void Assert_Failed(uint8_t *func, uint32_t line);
#define ASSERT(expr)            ((expr) ? (void)0U : Assert_Failed((uint8_t *)__func__, __LINE__))


#define STATIC_ASSERT(...)      extern char (*_do_assert(void)) [sizeof(char[1 - 2*!(__VA_ARGS__)])]
void func()
{
     ASSERT(sizeof(AES256_KEY) != 32);
     ASSERT(sizeof(AES256_IV) != 16);
STATIC_ASSERT(sizeof(AES256_IV)!=16);
}

286bd05a-4d44-11ef-b8af-92fbcf53809c.png

調(diào)試的時候,STATIC_ASSERT ,但是 ASSERT不報錯。

這讓魚鷹百思不得其解,一開始以為兩個宏邏輯相反,不都是邏輯值為假時報錯。

但是通過分析宏發(fā)現(xiàn),都是假的時候報錯。

那肯定哪里分析有問題了。

因為編譯器如果能得到結(jié)果為真,ASSERT可能無法形成代碼,即為空(void)0U。

因此魚鷹使用了一個變量作為中間值,強行讓編譯器生成斷言相關(guān)的代碼,才算是發(fā)現(xiàn)了問題。

void func()
{
uint32_tsize = sizeof(AES256_IV); 

    ASSERT(sizeof(AES256_KEY) != 32);
    ASSERT(size!=16);
    STATIC_ASSERT(sizeof(AES256_IV) != 16);
}

這個size 的值竟然是 17,而不是 16,難怪初始代碼不報錯,17 != 16,當然為真,當然不報錯。

但寫代碼的人是希望這個字符串的長度為始終是16(不包含null的情況下),而明顯代碼中使用sizeof 時計算了 null 的長度。

所以代碼應該這樣寫才對:

void func()
{
ASSERT(sizeof(AES256_KEY)==32);
ASSERT(sizeof(AES256_IV)==16);
STATIC_ASSERT(sizeof(AES256_IV)==16);
}

但是又因為代碼的sizeof 會計算null,因此需要去除這個數(shù):

void func()
{
ASSERT(sizeof(AES256_KEY) - 1==32);
ASSERT(sizeof(AES256_IV) - 1==16);
STATIC_ASSERT(sizeof(AES256_IV) - 1==16);
}

2884bafc-4d44-11ef-b8af-92fbcf53809c.png

這樣 STATIC_ASSERT 可以在編譯階段就可以判斷這個字符串的長度是否符合要求,多一個、少一個字符都不行。

這個坑你們遇到過嗎?

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    585

    瀏覽量

    20610
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1642

    瀏覽量

    49306
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    661

    瀏覽量

    33060

原文標題:被斷言罷了一道

文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請問各位大神一段只讀亂序字符串能否排序輸出嗎

    請問各位大神一段只讀亂序字符串能否排序輸出嗎
    發(fā)表于 05-14 12:45

    Labview之字符串長度函數(shù)

    Labview之字符串長度函數(shù),很好的Labview資料,快來下載學習吧。
    發(fā)表于 04-19 10:43 ?0次下載

    清華集訓2017模擬之字符串

    一個字符串的權(quán)值是這個包含的不同字符個數(shù)。 給定長度為n的字符串,把它分為k個連續(xù)非空字段
    發(fā)表于 11-28 16:33 ?1440次閱讀

    字符串移位包含的問題解決方案

    問題:給定字符串s和t,判斷是否字符串t能通過將s移位后的字符串所包含。 方法 最簡單的方法就是將s進行循環(huán)移位,再
    發(fā)表于 11-29 10:05 ?1069次閱讀

    教你7個Python判斷字符串是否包含子的方法

    教你7個Python判斷字符串是否包含子的方法
    的頭像 發(fā)表于 08-17 10:52 ?5145次閱讀
    教你7個Python<b class='flag-5'>判斷</b><b class='flag-5'>字符串</b>是否包含子<b class='flag-5'>串</b>的方法

    C語言總結(jié)_字符串全方位練習

    C語言字符串全方位練習,涉及知識點:字符串解析、大小寫判斷、字符串插入、字符串刪除、字符串排序、
    的頭像 發(fā)表于 08-14 09:41 ?1565次閱讀

    文詳解JavaScript字符串

    JavaScript字符串是原始值。此外,字符串是不可變的。這意味著如果你修改一個字符串,你總是會得到個新的字符串。原始
    的頭像 發(fā)表于 12-08 16:36 ?1259次閱讀

    字符串的格式化輸入和輸出

    字符串是內(nèi)存中一段連續(xù)的char空間,以’\0’(數(shù)字0)結(jié)尾。
    的頭像 發(fā)表于 02-24 14:34 ?1494次閱讀
    <b class='flag-5'>字符串</b>的格式化輸入和輸出

    字符串的相關(guān)知識

    TCL 中的數(shù)據(jù)類型只有種:字符串。這些字符串可以是字母、數(shù)字、布爾值、標點符號等特殊字符的組合。在某些特殊命令的作用下,字符串可以向其他
    的頭像 發(fā)表于 03-29 11:41 ?1194次閱讀

    mysql字符串包含某個字符串

    MySQL是種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),被廣泛用于構(gòu)建Web應用程序和其他大型數(shù)據(jù)驅(qū)動的應用。在進行MySQL數(shù)據(jù)庫查詢時,經(jīng)常需要使用字符串包含操作,即判斷一個字符串是否包含另
    的頭像 發(fā)表于 11-16 14:52 ?3940次閱讀

    python輸出固定長度字符串

    Python 是種強大而靈活的編程語言,具有許多用于處理字符串的功能。在 Python 中,有多種方法可以輸出固定長度字符串。下面將詳細介紹這些方法。 方法
    的頭像 發(fā)表于 11-22 10:41 ?3492次閱讀

    oracle判斷字符串包含某個字符

    字符串操作是任何編程語言中都非常重要的部分,Oracle數(shù)據(jù)庫作為目前最常用的關(guān)系型數(shù)據(jù)庫之,也提供了豐富的字符串操作函數(shù)和方法。在本文中,我們將詳細解析如何在Oracle中
    的頭像 發(fā)表于 12-06 09:53 ?1.5w次閱讀

    labview中常用的字符串函數(shù)有哪些?

    在LabVIEW中,常用的字符串函數(shù)廣泛覆蓋了對字符串的各種操作,包括但不限于格式化、搜索、替換、連接、計算長度等。以下是些常用的字符串
    的頭像 發(fā)表于 09-04 15:43 ?998次閱讀

    字符串字符數(shù)組的區(qū)別

    大多數(shù)編程語言中是個高級數(shù)據(jù)結(jié)構(gòu),通常由語言的運行時環(huán)境直接支持。字符串通常以連續(xù)的字符序列存儲,但它們不僅僅是字符的簡單集合。字符串對象
    的頭像 發(fā)表于 01-07 15:29 ?297次閱讀

    字符串在數(shù)據(jù)庫中的存儲方式

    數(shù)據(jù)庫是現(xiàn)代信息技術(shù)中存儲和管理數(shù)據(jù)的核心組件。字符串作為最常見的數(shù)據(jù)類型之,在數(shù)據(jù)庫中的存儲方式對其性能和可擴展性有著重要影響。 數(shù)據(jù)類型 固定長度字符串 :如CHAR類型,它為每
    的頭像 發(fā)表于 01-07 15:41 ?203次閱讀