我遇到了一个特定的问题。我正在尝试取一个字符串,并反转字符串中的字符大小写 例如:“HaVinG FuN”应该翻到“hAvINg fUn”。 我认为它与我的循环或我的If / Else语句有关。我错过了什么?所有大写字符仍然大写。所有小写字符也大写出来...我的另外两个函数表现正常,但不是我的reverseFunct函数...仅供参考我还省略了其他函数来尝试减少杂乱并关注我的问题。
class Help<T : Any>{
fun printHelp(message :T){
message.render();
}
}
答案 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;
}