簡體   English   中英

C 語言。 不使用空終止符的字符串長度

[英]C language. Length of the string without using null-termination

strlen() 認為 '\00' 是字符串的結尾。 如何計算實際長度? 例如,Pascal 中有 AnsiString 類型 它可以包含許多 #$00,但 Length(s) 將給出正確的結果。 編譯的 pascal 代碼的調試顯示 pascal 將長度放在第一個元素 (@s[0] - 4) 之前的 dword 並在需要時為我重新計算它。 C 語言中是否有相同的內容(或者我必須手動分配 memory 並處理 -1 - 元素)? 如果沒有,C 語言比 Pascal 差很多。

C 標准規定字符串以 NUL 字符結尾。 字符串可能存儲在一個比它大的數組中,但是如果你只得到一個指向數組的指針,就無法獲得數組的大小。

#include <stdio.h>

void f(char *s)
{
    printf("%s\n", s);
    // you can't get the size of array s here
}

int main(void)
{
    char s[100] = "hi";
    printf("size of s = %zu\n", sizeof(s)); // this works
    f(s);
    return 0;
}

問題

C語言有沒有相同的東西?

不,在 C 或標准 C 庫中沒有類似的東西。 但是,該語言提供了構建塊來定義這樣的類型並創建 API 函數來處理該類型。

就像是:

typedef struct AnsiString
{
    size_t len;
    char* data;
} AnsiString;

AnsiString createAnsiString(size_t len)
{
   AnsiString s;
   s.len = len;
   s.data = malloc(len);
   return s;
}

void deleteAnsiString(AnsiString s)
{
   free(s.data);
}

然后你可以使用

AnsiString s = createAnsiString(10);

// Use s as you please

deleteAnsiString(s);

這個問題的最大問題是字符串在 C 中不被視為“類型”。它是一種值模式......例如,想想十的倍數的整數。 它們都以 0 結尾,但您可以將它們存儲在任何類型的 integer 中,前提是它們在范圍內。 字符串是相似的; 您可以將它們存儲在 arrays 的charsigned charwchar_t等中。它們不是類型,但是……它們是適合特定模式的值。

該模式類似於我上面描述的“十的倍數”:字符串是在第一個'\0'處結束的數字序列。 如果沒有 NUL 字符,則它不是字符串。 這只是一個字符序列。

如果你想要數組的大小,而數組還沒有轉換為指針類型,你可以使用sizeof array ,因為數組仍然帶有大小信息。 但是,一旦將數組轉換為指針(以數組標識符作為參數調用 function 時,作為常見示例),您需要手動攜帶大小信息。 結果,標准函數通常使用單獨的大小 arguments,例如fgets(array, sizeof array, stdin); .

您是否認為 C 比 Pascal 更好或更差是一個見仁見智的問題,您有一個優點。 Pascal 與 C 的主要區別在於易於開發編譯器,如果您嘗試編寫一個編譯器就會發現這一點(順便說一句,這是學習該語言一切的好方法)。

然而,在宏偉的計划中,這只是一個更大問題的一小部分,Pascal 也深受其害。 如果您打算根據編寫表達能力的代碼來比較編程語言,您可能會發現這篇根據表達能力對編程語言進行排名的文章很有用。

祝你的語言學習好運:) 很高興看到人們開發使用語言最大表達潛力的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM