簡體   English   中英

為什么將tolower()的結果流傳輸到std :: cout時卻得到一個數字,而不是使用putchar()時卻得到數字?

[英]Why do I get a number when I stream the result of tolower() to std::cout, but not when I use putchar()?

我試圖編寫一個程序來轉換每個單詞(大寫或小寫)為大寫或小寫(取決於最大大小寫)。這是我的程序

#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
using namespace std;
int main()
{
    char s[101];
    int c=0, sm=0, i;

    cin>>s;

    for(i=0;i<strlen(s);i++)
    {
        if(s[i]>='A' && s[i]<='Z')
            c++;
        else
            sm++;
    }

    if(sm>c)
    {
        for(i=0;i<strlen(s);i++)
        {
            //cout<<tolower(s[i])<<endl;
            putchar(tolower(s[i]));
        }
    }
    else
    {
        for(i=0;i<strlen(s);i++)
        {
            //cout<<toupper(s[i])<<endl;
            putchar(toupper(s[i]));
        }
    }
}

但是我很驚訝地看到如果我寫這些聲明

if(sm>c)
    {
        for(i=0;i<strlen(s);i++)
        {
            cout<<tolower(s[i])<<endl;                
        }
    }

要么

else
    {
        for(i=0;i<strlen(s);i++)
        {
            //cout<<toupper(s[i])<<endl;
            putchar(toupper(s[i]));
        }
    }

那么似乎輸出是ASCII數字。有人可以解釋我這些原因。我是c ++的新手,所以對cout的了解不多

其背后的原因是tolower() tolower()的返回類型為int。

這意味着它等同於打印整數而不是字符。

如果要正確顯示它,請使用以下命令:

cout << static_cast<char>(tolower(s[i])) << "\n";

std::tolower()std::toupper()函數的返回值為int。 然后std::cout打印出現的確切值。

因此cout<< tolower(s[i])<<endl打印字符的ASCII值。 但是,當您編寫putchar(toupper(s[i])) putchar()函數會自動將ASCII值轉換為字符。 這就是為什么將字符作為輸出的原因。

為了使用cout<< tolower(s[i]) << endl您需要將ASCII值強制轉換為字符。

所以寫-

cout<< (char)(toupper[i]) <<endl;
cout<< (char)(tolower[i]) <<endl;

補充一點,這是一個錯誤的比較。

C ++的putchar等效於ostream::put ,如下所示:

std::cout.put(std::tolower(s[i]));

由於this和putchar使用char ,因此將執行隱式轉換。 這是必要的,因為tolower給您一個int (出於歷史原因)。

流式運算符<<更通用,並且具有各種類型的重載,以便它可以為您格式化數據。 因為您要給它一個int ,而不是特別要求一個char ,所以您可以得到一個數字。

從對cplusplus.com參考tolower

該值以int值形式返回,該值可以隱式轉換為char。

但是,打印返回的int不會將其轉換為char。 您可以顯式轉換它:

std::cout<< (char) tolower(s[i])<<endl;  

但是,靜態強制轉換更安全:

std::cout << static_cast<char>(tolower(s[i]));

cout打印出該值,在C ++中,tolower返回一個int(ASCII),因此,如果要大喊實際字符,則需要手動轉換輸出。

cout<<static_cast<char>((s[i]))<<endl;

C ++的在線編輯器(示例)

在這種情況下:

if(sm>c)
    {
        for(i=0;i<strlen(s);i++)
        {
            cout<<tolower(s[i])<<endl;                
        }
    }

是的,您應該期望一個ASCII值。 這是因為tolower是一個返回整數並且cout直接輸出給定值的函數,它不執行任何操作。

但是,您在這種情況下說過:

else
    {
        for(i=0;i<strlen(s);i++)
        {
            //cout<<toupper(s[i])<<endl;
            putchar(toupper(s[i]));
        }
    }

您還獲得了ASCII值,但我認為您錯了。 這應該輸出一個字符,因為putchar()函數不僅輸出給定的字符,而且事先執行操作以確保其為char格式。

暫無
暫無

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

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