我找不到任何会导致此结果的错误
I can't find any error that will lead to this result
我是 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.
都能正常工作。
my name is ma sean.
my name is sean ma.
我在发布和调试配置中都尝试了以上四个输入,都是一样的。
请详细说明问题,使解释对初学者更友好。
感谢任何帮助。提前谢谢你。
对于初学者可变长度数组,例如这个数组的声明
char userInputArray [userInput.size()];
不是标准的 C++ 功能。
不需要使用辅助数组来执行任务。您可以更改类型 std::string
本身的原始对象 userInput
。
这个变长数组
char outputArray [userInput.size()];
不包含终止零字符的 space '[=18=]'
以使存储的字符序列成为字符串。
结果这个输出
std::cout << outputArray << '\n';
调用未定义的行为。
这个for循环
for (int i = 0; i <= userInput.size(); ++i)
导致访问超出声明的可变长度数组的内存,因为索引的有效范围是[ 0, userInput.size() )
。
此外,使用幻数(例如 65 或 90)也不是一个好主意。这会使代码不可读。
如果我没理解错的话,您需要的是如下面的演示程序中所示的功能。
#include <iostream>
#include <string>
#include <cctype>
std::string & cRaZyTeXt_generator( std::string &s )
{
int upper_case = 1;
for (auto &c : s)
{
if ( std::isalpha( static_cast< unsigned char >( c ) ) )
{
if ( ( upper_case ^= 1 ) )
{
c = std::toupper( static_cast< unsigned char >( c ) );
}
else
{
c = std::tolower( static_cast< unsigned char >( c ) );
}
}
}
return s;
}
int main()
{
std::string s( "Hello, World!" );
std::cout << s << '\n';
std::cout << cRaZyTeXt_generator( s ) << '\n';
}
程序输出为
Hello, World!
hElLo, WoRlD!
我是 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.
都能正常工作。
my name is ma sean.
my name is sean ma.
我在发布和调试配置中都尝试了以上四个输入,都是一样的。
请详细说明问题,使解释对初学者更友好。
感谢任何帮助。提前谢谢你。
对于初学者可变长度数组,例如这个数组的声明
char userInputArray [userInput.size()];
不是标准的 C++ 功能。
不需要使用辅助数组来执行任务。您可以更改类型 std::string
本身的原始对象 userInput
。
这个变长数组
char outputArray [userInput.size()];
不包含终止零字符的 space '[=18=]'
以使存储的字符序列成为字符串。
结果这个输出
std::cout << outputArray << '\n';
调用未定义的行为。
这个for循环
for (int i = 0; i <= userInput.size(); ++i)
导致访问超出声明的可变长度数组的内存,因为索引的有效范围是[ 0, userInput.size() )
。
此外,使用幻数(例如 65 或 90)也不是一个好主意。这会使代码不可读。
如果我没理解错的话,您需要的是如下面的演示程序中所示的功能。
#include <iostream>
#include <string>
#include <cctype>
std::string & cRaZyTeXt_generator( std::string &s )
{
int upper_case = 1;
for (auto &c : s)
{
if ( std::isalpha( static_cast< unsigned char >( c ) ) )
{
if ( ( upper_case ^= 1 ) )
{
c = std::toupper( static_cast< unsigned char >( c ) );
}
else
{
c = std::tolower( static_cast< unsigned char >( c ) );
}
}
}
return s;
}
int main()
{
std::string s( "Hello, World!" );
std::cout << s << '\n';
std::cout << cRaZyTeXt_generator( s ) << '\n';
}
程序输出为
Hello, World!
hElLo, WoRlD!