1. 程式人生 > 其它 >c++ strlen函式標頭檔案_C語言學習之我見memchr()記憶體查詢字元函式

c++ strlen函式標頭檔案_C語言學習之我見memchr()記憶體查詢字元函式

技術標籤:c++ strlen函式標頭檔案

memchr()記憶體查詢字元函式:主要用於從記憶體中查詢自己需要的字元位置。

(1)函式原型:

void *memchr(const void *_Buf ,int _Val,size_t _MaxCount)

(2)標頭檔案

#include 

(3)功能:

  在記憶體中,從第一個變數constvoid*_Buf給出的記憶體地址開始,以位元組為單位,按照第二個變數int_Val所對應的位元組值查詢。如果有則返回所對應的位元組記憶體地址,如果沒有則返回NULL或者奔潰。第三個變數size_t_MaxCount表示查詢的最大範圍。

(4)基礎例項程式碼:

    char a[]="hello zobol!";    char c='z';    char* ret;        ret =  (char*)memchr(a,c,strlen(a));    printf("%c",*ret);//*的意思是取出地址所對應記憶體位置的值     printf("%s",ret);//%s是用於字串輸出,輸入一個記憶體的地址,//會自動輸出從開頭到\0的值

(5)輸出情況:

8512a20f4d1a67226b2d3c2b3d545c8d.png

(6)問題1:int _Val的取值範圍0~255,可以超過嗎?:

  回答:不可以,int_Val的值對應是一位元組二進位制0000 0000~11111111的無符號數值,不可以超過否則會發生錯誤,程式直接奔潰,不是返回空指標。一般情況下用char表示,自動強制轉換為int比較好。

  例項程式碼:

    char b[]="公眾號:zobol的魔法藏書室";    int vali = 111;//'o'的對應ascii碼    int vali2 = 300; //超限值     char* ret2 =  (char*)memchr(b,vali,15);    char* ret3 =  (char*)memchr(b,vali2,7);    printf("%c\n",*ret2);//*的意思是取出地址所對應記憶體位置的值     printf("%s\n",ret2);//%s是用於字串輸出,輸入一個記憶體的地址,會自動輸出從開頭到\0的值    printf("%c\n",*ret3);//*的意思是取出地址所對應記憶體位置的值     printf("%s\n",ret3);

  執行情況:

55c92b7112743d1dab1b606ceb732246.png

 (注意返回值,程式是直接奔潰,不是正常結束)

(7)問題2:用於字串查詢,不知道字串長度怎麼辦?

  回答:用strlen()函式獲取,不能像python那樣用-1表示結尾,C語言中字串不是物件沒有被封裝。

(8)問題3:對於'\0'能查詢嗎?

  回答:可以,memchr針對的是一段記憶體,而不是一個字串,只要二進位制對於的值相等,就會返回。

(9)問題4:如果有兩個重複的字元值,在查詢範圍內,返回哪一個?

  回答:返回離const void *_Buf開頭記憶體地址最近的字元地址。

  示例程式碼:

    char c[]="公眾號:zobol的魔法藏書室";    int valii = 111;//'o'的對應ascii碼    char* ret4 =  (char*)memchr(c,valii,strlen(c));    char* ret5 =  (char*)memchr(ret4+1,valii,strlen(c));//記憶體地址加1,跳過第一個o     printf("%s\n",ret4);    printf("%s\n",ret5);

  執行情況:

44065ee718b73499c9ae5d3530c83b42.png

(10)問題5:如果size_t _MaxCount範圍超過字串長度,或者在合法範圍內沒有找到符合的字元值,會返回什麼?

  回答:並不是返回空指標,經過測試,是直接奔潰。(在不同編譯器也許實現不一樣)