反转字符串的字符大小写

时间:2018-02-24 07:34:40

标签: c++

我遇到了一个特定的问题。我正在尝试取一个字符串,并反转字符串中的字符大小写 例如:“HaVinG FuN”应该翻到“hAvINg fUn”。 我认为它与我的循环或我的If / Else语句有关。我错过了什么?所有大写字符仍然大写。所有小写​​字符也大写出来...我的另外两个函数表现正常,但不是我的reverseFunct函数...仅供参考我还省略了其他函数来尝试减少杂乱并关注我的问题。

class Help<T : Any>{
 fun printHelp(message :T){
     message.render();
 }
}

5 个答案:

答案 0 :(得分:3)

您对小写字母的检查显示为

else if (islower(ltrptr[count]));

注意额外的分号。

这个分号终止if语句,因此后续转换为大写不是if语句的then子句,而是在每个字符上无条件地执行。

答案 1 :(得分:2)

您正在编写C代码。这是一种C ++方法:

#include <string>
#include <algorithm>

char reverse_case_char(char c) {
    const auto uc = static_cast<unsigned char>(c); // Sic.
    return ::isupper(uc)? ::tolower(uc): ::toupper(uc);
}
void reverse_case(std::string& str) {
    std::transform(str.begin(), str.end(), str.begin(), reverse_case_char);
}
#include <cassert>
int main()
{
    std::string fun = "HaVinG FuN";
    reverse_case(fun);
    assert(fun == "hAvINg fUn");
    return 0;
}

答案 2 :(得分:1)

像这样改变

// Function Prototypes  "HaVinG FuN" should flip to "hAvINg fUn."
void reverseFunct(char *);

int main()
{
    //cout << "Enter a string: " << endl;
    char ltrs[300] = "HaVinG FuN";
    //cin.getline(ltrs, 300);
    char *ptr = nullptr;
    ptr = ltrs;


    reverseFunct(ptr);

    ptr = nullptr;
    return 0;
}

void reverseFunct(char *ltrptr) // <-----NOT REVERSING CHARACTERS 
{
    int count = 0;

    while (ltrptr[count] != '\0')
    {
        if (isupper(ltrptr[count]))
        {
            ltrptr[count] = tolower(ltrptr[count]);
        }
        else 
        {
            ltrptr[count] = toupper(ltrptr[count]);
        }
        count++;
    }
    cout << "---> reverse function: " << ltrptr << endl;
}

答案 3 :(得分:0)

其他人已经在您的代码中指出了错误,因此无需重复。相反,这个答案将提供一些实现任务的替代方法。

您的代码比C ++风格更具C风格。 C ++具有许多功能/特性,允许您以更短的形式编写它。

char ltrs[300] = "HaVinG FuN";
for (auto& ch : ltrs) ch = islower(ch) ? toupper(ch) : tolower(ch);
std::cout << ltrs << std::endl;

char ltrs[300] = "HaVinG FuN";
std::for_each(ltrs, ltrs + strlen(ltrs), [](char& ch) 
             { ch = islower(ch) ? toupper(ch) : tolower(ch); });
std::cout << ltrs << std::endl;

或使用std :: string

std::string str("HaVinG FuN");
for (auto& ch : str) ch = islower(ch) ? toupper(ch) : tolower(ch);
std::cout << str << std::endl;

使用这些C ++函数/特性使程序更短,更容易理解,并且错误的风险更低。

答案 4 :(得分:0)

感谢您的帮助!我最终弄清楚了我的答案,同时能够保持我的不那么优雅的代码适合我的班级。 Bipll最终给了我我想要的东西,每次都要修改我的原始阵列。

我意识到我的解决方案很草率,不适合工作环境,但它符合我的家庭作业,因为我们的老师鼓励我们从头开始学习C ++,而不是得到太多的直接答案来自像SO这样的地方。所以我很高兴我从这里学到了一点,以及帮助我​​看到问题的间接方式。

我最终制作了原始数组的副本,并将该副本传递给我的上一个反转功能。我能够使用原始数组作为前两个函数,因为第一个函数大写了数组中的每个字符,而第二个函数使它们全部小写。因此,第三个函数反向必须能够访问原始数组,但是在第3个顺序中。对于像我这样的菜鸟来说,最简单的方法是给出第一个数组的副本并将其用于第三个函数。

//Snippet of code I needed
int main()
{
int index = 0;
cout << "Enter a string: " << endl;
const int Size = 300;
char ltrs[Size];
cin.getline(ltrs, Size);
char arrayCopy[Size];
char *ptr = nullptr;
char *ptr2 = nullptr;
ptr = ltrs;

//Copy of ltrs Array
//----------------------------------//
while (ptr[index] != '\0')          //
{                                   //
    arrayCopy[index] = ptr[index];  //
    index++;                        //
}                                   //
    arrayCopy[index] = '\0';        //
                                    //
    ptr2 = arrayCopy;               //
//----------------------------------//
return 0;
}
// Function to Reverse
void reverseFunct(char *ltrptr) 
{
int count = 0;

while (ltrptr[count] != '\0')
  {
    if (isupper(ltrptr[count]))
    {
        ltrptr[count] = tolower(ltrptr[count]);
    }
    else
    {
        ltrptr[count] = toupper(ltrptr[count]);
    }
    count++;
  }
cout << "---> reverse function: " << ltrptr << endl;
}