为什么我在将 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 number.Can 谁能给我解释一下 reason.I 我是 c++ 的新手,所以不太了解 cout

这背后的原因是tolower()tolower() 的 return 类型是 int.

这意味着它相当于打印一个整数,而不是一个字符。

如果你想正确显示它,使用这个:

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

来自 tolower 的 cplusplus.com 参考:

The value is returned as an int value that can be implicitly casted to char.

但是打印返回的 int 不会将其转换为 char。您可以显式转换它:

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

However a static cast is safer:

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

cout 打印值,在 C++ 中,a tolower returns a int (ASCII) 所以你得到的是,如果你想大喊你需要手动转换输出的实际字符。

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

Online editor to C++ (example)

std::tolower() and std::toupper() 函数 return 值为 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;

在这种情况下:

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

是的,您应该期待一个 ASCII 值。这是因为tolower是一个returns一个整数的函数,cout直接输出给定的值,它不进行任何操作。

然而你说的是在这种情况下:

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

你也得到了一个 ASCII 值,但我认为你错了。这应该输出一个字符,因为 putchar() 函数不仅输出给定的内容,而且事先执行操作以确保它是字符格式。

补充一下,这是一个错误的比较。

putchar 的 C++ 等价物是 ostream::put,像这样:

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

因为这和 putchar 都采用 char,所以执行了隐式转换。这是必要的,因为 tolower 给你一个 int(出于历史原因,有点)。

流运算符 << 更为通用,并且具有各种类型的重载,因此它可以为您格式化数据。因为你给它一个 int,而不是特别要求一个 char,所以你得到一个数字。