#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int i;
char s[100];
cin >> s;
for(i=0;i<strlen(s);i++)
{
if(islower(s[i])==1)
{
s[i]=strupr(s[i]);
cout << s[i];
}
else
{
s[i]=strlwr(s[i]);
cout << s[i];
}
}
return 0;
}
这两行s[i]=strupr(s[i])
和s[i]=strlwr(s[i])
显示此错误:
从char到char *的无效转换。
我该如何解决?谢谢。
答案 0 :(得分:7)
你应该使用这两个:
s[i] = std::toupper(s[i]);
s[i] = std::tolower(s[i]);
请记住加入<cctype>
。以下是std::toupper和std::tolower的一些文档的链接。
问题是strupr
和strlwr
适用于整个字符串,而不是单个字符。此外,它们就地运作,并且它们是非标准的。
旁注:
您可以考虑使用std::string s
代替char s[100]
,这会移除cin >> s;
中当前的溢出机会。
<强>更新强>
可以这样使用std::transform:
std::transform(std::begin(s), std::end(s), std::begin(s), [] (char c) { return std::islower(c) ? std::toupper(c) : std::tolower(c); });
使用std::begin(s)
和std::end(s)
的一个好处是,它适用于std::string
,std::vector
甚至char[100]
。
答案 1 :(得分:3)
strupr
和strlwr
期望char*
而不是char
作为参数。
您需要传递整个s
数组而不是s[i]
或者使用std::toupper
和std::tolower
,这样您就可以依次执行每个角色。
你也可以通过使用std :: transform和谓词或lamda来摆脱原始循环
char InvertCase(char c)
{
return islower(c) ? std::toupper(c) : std::tolower(c);
}
std::transform(s.begin(), s.end(), back_inserter(result), InvertCase);
答案 2 :(得分:2)
sdtrupr
和strlwr
取char * as an argument。要转换单个字符,请使用tolower
和toupper
答案 3 :(得分:2)
strupr()
修改其字符串(即char[]
)参数,用大写替换所有小写字母。我认为您将strupr()
与toupper()
混为一谈。
请注意,通过使用strupr()
或toupper()
,您隐含假设每个char
代表一个字符;对于UTF-8等多字节编码,情况并非如此。