【发布时间】:2021-10-11 16:05:12
【问题描述】:
我是 C++ 新手,想测试一下我实际学到了多少,所以我制作了这个简单的 cRaZyTeXt 生成器。但是有一个奇怪的错误我找不到任何解决方法。
代码在这里:
#include <iostream>
#include <string>
#include <algorithm>
#include <windows.h>
char convertToUppercase (char x)
{
int asciiCode {static_cast<int>(x) - 32};
char y {static_cast<char>(asciiCode)};
return y;
}
char convertToLowercase (char x)
{
int asciiCode {static_cast<int>(x) + 32};
char y {static_cast<char>(asciiCode)};
return y;
}
void toClipboard(const std::string &s){
OpenClipboard(0);
EmptyClipboard();
HGLOBAL hg=GlobalAlloc(GMEM_MOVEABLE,s.size() + 1);
if (!hg){
CloseClipboard();
return;
}
memcpy(GlobalLock(hg),s.c_str(),s.size() + 1);
GlobalUnlock(hg);
SetClipboardData(CF_TEXT,hg);
CloseClipboard();
GlobalFree(hg);
}
int main()
{
std::cout << "Enter the text you want to convert into cRaZy TeXt: " << '\n';
std::string userInput {};
std::getline(std::cin >> std::ws, userInput);
char userInputArray [userInput.size()];
std::copy(userInput.begin(), userInput.end(), userInputArray);
char outputArray [userInput.size()];
for (int i = 0; i <= userInput.size(); ++i)
{
int x {static_cast<int>(userInputArray[i])};
if (i % 2 == 0)
{
if (x <= 90 && x >= 65)
outputArray[i] = convertToLowercase(userInputArray[i]);
else
outputArray[i] = userInputArray[i];
}
else
{
if (x <= 122 && x >= 97)
outputArray[i] = convertToUppercase(userInputArray[i]);
else
outputArray[i] = userInputArray[i];
}
}
std::cout << outputArray << '\n';
toClipboard(outputArray);
system("pause");
return 0;
}
当我输入Hello, world! 时,它可以完全按照我想要的方式输出hElLo, WoRlD!。 proof
但是当我尝试my name is sean. 时,它的输出会是这样的:screenshot
mY NaMe iS SeAn.@y name is sean.@%�
更奇怪的是my name is ma sean. 和my name is sean ma. 都可以正常工作。
我在发布和调试配置中都尝试了以上四个输入,都一样。
请详细说明问题,让初学者的解释更友好。
感谢任何帮助。提前谢谢你。
【问题讨论】:
-
如果我去掉剪贴板内容并在 Linux 下运行,则看不到此问题。
-
正如其他人指出的那样,你不是 null 终止
outputArray所以这可能是你的问题。试试char outputArray [userInput.size()] = {0};,它可以确保你的 c 字符串总是以 null 结尾。 -
还有……你能做到吗?您不能像那样动态创建数组。使用
std::string否则你必须使用new来创建一个动态大小的数组。 -
for (int i = 0; i <= userInput.size(); ++i)减一。尝试越界读写会导致未定义的行为。 -
另外,
char outputArray [userInput.size()];是非标准 C++。最好使用std::string和push_back方法。
标签: c++ string algorithm uppercase lowercase