簡體   English   中英

字符轉換函數 std::isupper() & std::islower() C++17

[英]Character converting funtion std::isupper() & std::islower() C++17

我創建了一個簡單的程序來檢查用戶輸入的字母是大寫還是小寫,然后使用std::isupper()std::islower()函數將小寫轉換為大寫,將大寫轉換為小寫。 在運行代碼時,我得到數字形式的字符轉換,而不是預期的大寫/小寫等效。 這是為什么?

#include <iostream>

int main()
{
    char letter {};

    std::cout << "Enter a letter:";

    std::cin >> letter;

    if (std::isupper(letter))
    {
        std::cout << "You entered an uppercase letter"
                     "\n"
                     "the lowercase equivalent is:"
                  << std::tolower(letter);
    }

    if (std::islower(letter))    
    {
        std::cout << "You entered a lowercase letter"
                     "\n"
                     "the uppercase equivalent is:"
                  << std::toupper(letter);
    }

    return 0;
}

下面是一個輸出示例:

Enter a letter:F
You entered an uppercase letter.
The lowercase equivalent is:102

Enter a letter:f
You entered a lowercase letter.
The uppercase equivalent is:70

std::tolowerstd::toupper返回int ,而不是char由於它是 C 的遺留起源,因此選擇了int有某些要求,請參見腳注)。

您可以將其轉換回 char 以獲得預期結果:

static_cast<char>(std::tolower(letter));

或者您可以之前將結果保存在char變量中(如果您需要在其他地方轉換后者):

letter = std::tolower(letter);
std::cout << letter;

注意:正如Peter在評論中所注意到的,對std::tolowerstd::toupper有要求,要求使用比實際需要的類型大的類型。 在下面引用它:

它們還被指定為能夠接受和返回EOF - 一個不能表示為 char 但可以表示為 int 的值。 C++ iostreams(當然不是來自 C 的遺產,是模板化std::basic_istream )有一個沒有參數的get()函數,它從流中讀取一個字符,並返回一個大於正在讀取的字符類型的整數類型。 它是能夠從文件中讀取單個字符並處理錯誤情況的機制的一部分。

1. 選項

您可以使用<locale>標頭中的std::tolowerstd::toupper返回您希望它們返回的類型。

看一下例子:

char c {'T'};
std::cout << std::tolower(c, std::locale()) << std::endl; // output: t

char c {'t'};
std::cout << std::toupper(c, std::locale()) << std::endl; // output: T

檢查實時示例

2. 選項

您可以使用std::tolowerstd::toupper<cctype>標頭,返回int ,你需要強制轉換為char

以下是示例:

char c {'T'};
std::cout << static_cast<char>(std::tolower(c)) << std::endl; // output: t

char c {'t'};
std::cout << static_cast<char>(std::toupper(c)) << std::endl; // output: T

檢查實時示例

您還可以創建自己的方便的輔助函數:

char toupper(char c) {
    return static_cast<char>(std::toupper(static_cast<unsigned char>(c)));
}

char tolower(char c) {
    return static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
}

你可以這樣使用:

char c1 {'T'};
char c2 {'t'};
std::cout << tolower(c1) << std::endl; // output: t
std::cout << toupper(c2) << std::endl; // output: T
if(std::isupper(letter))
{

  std::cout<<"You entered an uppercase letter"<<"\n"

  "the lowercase equivalent is:" << (char)std::tolower(letter);
}

if (std::islower(letter))

{

  std::cout<<"You entered a lowercase letter"<<"\n"

  "the uppercase equivalent is:" << (char)std::toupper(letter);

}

    return 0;

}

std::tie 用於 C++17 結構運算符<!--?</div--><div id="text_translate"><p> 考慮以下 C++17 結構:</p><pre> struct S { M1 m1; M2 m2; M3 m3; bool operator<(const S& that) const { return tie() < that.tie(); } auto tie() const { return std::tie(m1,m2,m3); } };</pre><p> 這個對嗎? S::tie會返回成員引用的元組,還是會復制一份? 會自動推斷出正確的類型(引用元組)嗎? constness 做正確的事嗎?</p><p> (我看到的示例對 std::tie 進行了兩次調用,並且沒有像這樣分解為單獨的成員 function。想知道/懷疑是否有原因。)</p></div>

[英]std::tie for C++17 struct operator<?

暫無
暫無

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

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