为什么我在将 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;
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
,所以你得到一个数字。
我试图编写一个程序,将每个单词(大写或小写)转换为大写或小写(取决于最大大小写)。这是我的程序
#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;
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
,所以你得到一个数字。