繁体   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