将数组元素传递给消息框仅打印元素的第一个字符而不是整个字符串

Posted

技术标签:

【中文标题】将数组元素传递给消息框仅打印元素的第一个字符而不是整个字符串【英文标题】:Passing array elements to a message box only prints the first character of the element instead of the whole string 【发布时间】:2016-04-22 18:32:46 【问题描述】:

我最近开始使用 Visual C++,并且正在尝试掌握处理参数的窍门。我正在尝试使用CommandLineToArgvW() 创建一个参数数组,但是当将数组中的值传递给消息框时,只打印第一个字符,而不是整个字符串。例如,如果我使用ProjectName.exe test abc 123 运行程序,我将得到 4 个消息框,分别显示“P”、“t”、“a”和“1”。我在这里做错了什么?

int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR lpCmdLine, int show)     
    int argNum, i;
    LPWSTR *argList;

    argList = CommandLineToArgvW(GetCommandLineW(), &argNum);
    if (NULL == argList)
    
        wprintf(L"CommandLineToArgvW failed\n");
        return 0;
    
    else
    
        for (i = 0; i < argNum; i++)
        
            int msgboxID2 = MessageBox(
                NULL,
                (LPCSTR)argList[i],
                (LPCSTR)"Arguments",
                MB_OK
            );
        
    

    return 0;

【问题讨论】:

【参考方案1】:

使用带有 (LPCWSTR) 变量的 MessageBoxW() 就像一个魅力。当不使用宽字符串版本时,该字符与截断字符串的初始字符后的 0 配对(感谢 Freenode 上的 ville ##c++-general 帮助我并解释问题,即使他不使用 Windows )。

【讨论】:

这是一个示例,其中强制转换以消除编译器错误会让您陷入困境。 真正的问题是,你最初是从哪里得到要选角的想法的?此外,尽管在这种情况下您不应该这样做,但请使用特定的 C++ 类型转换而不是包罗万象的不安全 C 类型。 (我怀疑我在提倡针对 Win32 API 的代码链接的良好风格时正在打一场失败的战斗,但无论如何!) @drescherjm 哦,好吧,我明白了。 @underscore_d 我在 12 小时前才开始使用 VC++,所以我一直在从一堆不同的站点中查找代码。一旦我真正知道自己在做什么,我完全打算清理代码。 @TaylorRose 我知道它是怎么回事,但回想起来,最好花额外的时间/乏味的时间来了解你正在输入的内容(而不是粘贴!)并在第一时间把它弄好.通过将从不同来源粘贴的代码混杂在一起,您很有可能理解得更少,但风险更大。我去过那里,我认识的几个人也去过那里(即我必须解开/修复“谁的”代码)。

以上是关于将数组元素传递给消息框仅打印元素的第一个字符而不是整个字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何防止写入 0 而不是未输入的数组元素?

如何将字符串数组传递给C中的函数?

下拉输入元素行为奇怪,而不是将值传递给“search.php”页面

数组名作函数参数时,实参与形参变量之间的数据传递是?

SwiftUI 将数组的元素作为绑定传递给子视图

js如何判断一个值是数组中的第几个元素,并将这个值alert出来,不是打印元素,是打印它是第几个元素