5.3 字串長度

你可以使用strlen函式來取得字串的長度,這個函式宣告在標頭檔string.h中。

— 函式:size_t strlen (const char *s)

strlen函式以位元組傳回空字元結束的字串長度,(換句換說,它會傳回陣列內結束空字元的偏移值。)

例如,

          strlen ("hello, world")
              ⇒ 12

當應用到一個字元陣列時,strlen 函式傳回儲存在那裡的字串長度,而不是它配置的大小,你可以使用sizeof運算子取得字元陣列配置的大小:

          char string[32] = "hello, world";
          sizeof (string)
              ⇒ 32
          strlen (string)
              ⇒ 12

但要注意,除非string 是它自己的字元陣列而不是指標,否則無法運作,例如:

          char string[32] = "hello, world";
          char *ptr = string;
          sizeof (string)
              ⇒ 32
          sizeof (ptr)
              ⇒ 4  /* (on a machine with 4 byte pointers) */

當你正在使用接受字串引數的函式時,這是很容易犯的錯誤;這些引數是用指標而非陣列。

還必須注意的是多未元祖的編碼字串它的傳回值不必跟字串內的字元數一致,要取得值字串字串可以轉成寬字元,然後使用wcslen或是像下面的程式碼:

          /* The input is in string.
             The length is expected in n.  */
          {
            mbstate_t t;
            char *scopy = string;
            /* In initial state.  */
            memset (&t, '0', sizeof (t));
            /* Determine number of characters.  */
            n = mbsrtowcs (NULL, &scopy, strlen (scopy), &t);
          }

要是字元數(不是位元祖)是需要的話,這樣做有點麻煩,通常它都是在寬字元使用較好。

寬字元相對地宣告在wchar.h。

— 函式: size_t wcslen (const wchar_t *ws)

wcslen 函式是跟strlen一樣的用於寬字元中,傳回值是寬字元字串中由 ws 指到的寬字元數(這也是 ws結束寬字元的偏移值)。

因為沒有一個字元組成的多寬字元序列,所以傳回值不只是陣列的偏移值,它也是寬字元數。

此函式在ISO C90 修訂1時被提出。

— 函式: size_t strnlen (const char *s, size_t maxlen)

strnlen 函式假如其長度小於 maxlen 位元組則傳回以位元組表示的字串長度,否則就傳回 maxlen,因此這個函式相當於(strlen (s) < maxlen ? strlen (s) : maxlen) 的寫法但是它更有效率而且即使字串沒有空字元結束時。

          char string[32] = "hello, world";
          strnlen (string, 32)
              ⇒ 12
          strnlen (string, 5)
              ⇒ 5

這個函式是GNU擴充的而且宣告在string.h。

— 函式:size_t wcsnlen (const wchar_t *ws, size_t maxlen)

wcsnlen 相當於strnlen寬字元版,maxlen 參數指定最大的寬字元數。

這個函式是GNU擴充的而且宣告在wchar.h。

 

下一節:,上一節:String/Array Conventions,這一章:String and Array Utilities

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *