【问题标题】:C++ convert character array to uppercase ( no MFC )C++ 将字符数组转换为大写(无 MFC)
【发布时间】:2012-05-17 19:08:27
【问题描述】:

我正在尝试让我的应用程序将字符数组转换为大写字母,以便我可以将它们作为按键传递。我知道我快要让这段代码正常工作了,但我就是看不到问题所在。

            int a, b, c, d;
        char text[25];
        char upper[25];

        for (a = 0, b = sizeof(login); a < b; a++)
        {
            if (isalpha(login[a])){
                l[a] = toupper(login[a]);
                Sleep(1000);
                GenerateKey(l[a], FALSE);}
            else{
                GenerateKey(l[a], FALSE);
                Sleep(1000);
                l[a] = login[a];}
        }
        login[a]='\0';
        GenerateKey(0x09, FALSE);

        for (c = 0, d = sizeof(pass); c < d; c++)
        {
            if (isalpha(pass[c])){
                p[c] = toupper(pass[c]);
                GenerateKey(p[c], FALSE);
                Sleep(1000);}
            else{
                GenerateKey(p[c], FALSE);
                p[c] = pass[c];
                Sleep(1000);}
        }
        pass[a]='\0';

        GenerateKey(0x09, FALSE);
        Sleep(1000);
        GenerateKey(0x09, FALSE);
        Sleep(1000);
        GenerateKey(0x0D, FALSE);

这里是 GenerateKey 函数:

void GenerateKey(int vk, BOOL bExtended) {

KEYBDINPUT  kb = {0};
INPUT       Input = {0};

/* Generate a "key down" */
if (bExtended) { kb.dwFlags  = KEYEVENTF_EXTENDEDKEY; }
kb.wVk  = vk;
Input.type  = INPUT_KEYBOARD;
Input.ki  = kb;
SendInput(1, &Input, sizeof(Input));

/* Generate a "key up" */
ZeroMemory(&kb, sizeof(KEYBDINPUT));
ZeroMemory(&Input, sizeof(INPUT));
kb.dwFlags  =  KEYEVENTF_KEYUP;
if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));

return;
 }

任何帮助都会很棒!

编辑:

此应用程序正在尝试打开网页,然后输入登录信息并按提交(使用选项卡选择用户名、密码字段等)。为了回答@Rup,l[]p[] 在这段代码上方被初始化。

        char l[180];
        char p[180];

l 是用户的登录名,p 是他们的密码。我正在尝试将它们转换为大写以在 GenerateKey 中传递它们。例如GenerateKey('A', FALSE);

目前,代码似乎根本没有通过任何按键,但应用程序冻结了,所以我相信它卡在某个地方的 for 循环中。

编辑 2:

感谢@William 提供有用的代码。 使用 toUpper 函数我非常接近解决这个问题。我现在唯一遇到的问题是传递的登录名和密码包含额外的字符。例如,如果我以username 传递登录,然后重新运行程序并以user 传递登录,我得到输出userame

这是我现在使用 GenerateKey 和 toUpper 函数的代码:

            // Convert to uppercase to be passed as keypresses
        toUpper(login, sizeof(login));
        toUpper(pass, sizeof(pass));
        int a;
        for(a=0; a<sizeof(login);a++){
            GenerateKey(login[a], FALSE);}
        login[a]='\0';
        GenerateKey(0x09, FALSE);
        a=0;
        for(a=0; a<sizeof(pass);a++){
            GenerateKey(pass[a], FALSE);}
        pass[a]='\0';
        GenerateKey(0x09, FALSE);
        Sleep(1000);
        GenerateKey(0x09, FALSE);
        Sleep(1000);
        GenerateKey(0x0D, FALSE);

解决方案:

在上面的代码中使用strlen(login); 清除了我遇到的所有问题。

【问题讨论】:

  • 在 not isalpha 的情况下,您使用的是 l[a] 未初始化。但是你需要向我们提供更多关于什么是/不工作的细节——你能调试这个吗? login[] 是 ASCII 字符还是 VK 代码?你似乎在混合两者。
  • 问题到底是什么?
  • 抱歉,我已经编辑了我的问题以提供更多信息。
  • 谢谢 - 但这是声明 l[a] 没有初始化它。 (除非它们是全局变量,否则没有隐式的 init-to-0。)我的意思是你在设置l[a] 的行之前调用GenerateKey(l[a], FALSE);。您应该能够确定它在调试器中挂起的位置。
  • 是的 - 或者 for(a=0; (login[a] != 0) &amp;&amp; (a&lt;sizeof(login)); a++) 也可以。

标签: c++ keypress uppercase character-arrays


【解决方案1】:
void toUpper(char* pArray, int arrayLength)
{
    for(int i = 0; i < arrayLength; i++)
    {
        if(pArray[i] >= 'a' && pArray[i] <= 'z')
            pArray[i] -= ' ';
    }
}

【讨论】:

  • 请执行以下操作:pArray[i] &gt;= 'a' &amp;&amp; pArray[i] &lt;= 'z'),以及类似的作业。
  • 感谢此代码。我仍然有一个小问题。我已经用详细信息更新了我原来的问题。
【解决方案2】:

我已经用下面的代码解决了这个问题:

代码在cmets中有解释。

        // Convert to uppercase to be passed as keypresses
        toUpper(login, sizeof(login));
        toUpper(pass, sizeof(pass));
        int a;
        // Loop through the character array and send the key presses
        for(a=0; a<strlen(login);a++){
            GenerateKey(login[a], FALSE);}
        GenerateKey(0x09, FALSE);
        for(a=0; a<strlen(pass);a++){
            GenerateKey(pass[a], FALSE);}
        // Additional keypresses
        GenerateKey(0x09, FALSE);
        Sleep(1000);
        GenerateKey(0x09, FALSE);
        Sleep(1000);
        GenerateKey(0x0D, FALSE);

还需要提供的 GenerateKey 函数和 toUpper 函数才能使此代码正常运行。

感谢您在此问题上提供的所有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 2020-12-11
    • 2021-05-07
    • 1970-01-01
    • 2013-05-14
    • 2011-04-11
    • 2010-10-18
    • 2014-06-18
    相关资源
    最近更新 更多