簡體   English   中英

資本如何運作?

[英]How does capitalize work?

我正在嘗試了解String#capitalize! 在內部工作。 我可以創建一個哈希。 給定的字符串foo = "the"foo[0]"t" ,查找該lower_case "t" ,並與上殼體匹配它"T"的值。 實際上,Ruby源代碼顯示:

static VALUE
rb_str_capitalize_bang(VALUE str)
{
    rb_encoding *enc;
    char *s, *send;
    int modify = 0;
    unsigned int c;
    int n;

    str_modify_keep_cr(str);
    enc = STR_ENC_GET(str);
    rb_str_check_dummy_enc(enc);
    if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil;
    s = RSTRING_PTR(str); send = RSTRING_END(str);

    c = rb_enc_codepoint_len(s, send, &n, enc);
    if (rb_enc_islower(c, enc)) {
        rb_enc_mbcput(rb_enc_toupper(c, enc), s, enc);
        modify = 1;
    }
    s += n;
    while (s < send) {
        c = rb_enc_codepoint_len(s, send, &n, enc);
        if (rb_enc_isupper(c, enc)) {
            rb_enc_mbcput(rb_enc_tolower(c, enc), s, enc);
            modify = 1;
        }
        s += n;
    }

    if (modify) return str;
    return Qnil;
}

相關功能是toupper 如何知道toupper("t")等於"T"

您想知道它是什么字符的大寫版本嗎? 像大多數此類功能的實際實現一樣,它使用查找表

toupperansi C函數 這意味着確切的實現實際上取決於您的庫的提供程序,大多數情況下是您的編譯器。

可能是它遵循ASCII表,因為沒有比整數之和更快速的查找-查找中的步驟之一應包括求和,以計算新地址。

因此, 在gcc上 ,我們有此實現

char
ctype<char>::do_toupper(char __c) const
{
  int __x = __c;
  return (this->is(ctype_base::lower, __c) ? (__x - 'a' + 'A') : __x);
}

這基本上檢查它是否降低。 如果是,則返回較低的值。 否則,它的確減去97,然后求和65,這與減去32相同。請記住,對於計算機來說,字符和數字是相同的,只是二進制數據。 然后,請注意如何使用字符而不是數字來提高可讀性(嗯,至少對於C語言人而言)。

不查看任何源代碼,我想一種方法是將字符轉換為其相應的ASCII值,從中減去32,然后將ASCII值轉換回char。

在此處輸入圖片說明

暫無
暫無

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

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