使用strupr和strlwr时如何解决错误“char无效转换为char *”?

时间:2017-04-18 09:31:16

标签: c++ string

#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 *的无效转换。

我该如何解决?谢谢。

4 个答案:

答案 0 :(得分:7)

你应该使用这两个:

s[i] = std::toupper(s[i]);
s[i] = std::tolower(s[i]);

请记住加入<cctype>。以下是std::toupperstd::tolower的一些文档的链接。

问题是struprstrlwr适用于整个字符串,而不是单个字符。此外,它们就地运作,并且它们是非标准的。

旁注:

您可以考虑使用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::stringstd::vector甚至char[100]

答案 1 :(得分:3)

struprstrlwr期望char*而不是char作为参数。

您需要传递整个s数组而不是s[i]

或者使用std::toupperstd::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)

sdtruprstrlwrchar * as an argument。要转换单个字符,请使用tolowertoupper

答案 3 :(得分:2)

strupr()修改其字符串(即char[])参数,用大写替换所有小写字母。我认为您将strupr()toupper()混为一谈。

请注意,通过使用strupr()toupper(),您隐含假设每个char代表一个字符;对于UTF-8等多字节编码,情况并非如此。