[英]Why do I get error “'cout' in namespace 'std' does not name a type” when I use “using cout = std::cout;”?
[英]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;
在这种情况下:
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.