0

我可能完全错过了这里的重点,但我有以下方法可以在 Visual Studio 的 cpp 程序中打印出 args:

int _tmain(int argc, char* argv[])
{

    char* fu = "Bar";

    std::cout << "Test, " << argc << ", " << argv[0] << ", " << argv[1] << ", " << fu << endl;
        printf("%s, %s, %s", argv[0], argv[1], fu);
    return 0;
}

我遇到的问题是它似乎只打印 args 的第一个字符而不是整个字符串。

据我所知,argv[0] 取消引用 argv 数组以获取 char*,这就是我传递给 cout/printf 函数的内容。然后他们应该打印所有字符,直到 \0 字符。

我创建了测试 char* fu 以查看问题是否在于将 char* 传递给函数,但成功打印了“Bar”。

我唯一能想到的是因为 fu 的大小在编译时是已知的,而 argv 的大小并不是什么有趣的事情,因为它的编译方式正在发生。

我知道我可以通过遍历字符来打印出内容,但这似乎违背了这一点,例如,如果我想使用字符串进行比较或其他什么。有人可以解释发生了什么吗?

4

2 回答 2

2

要么更改_tmainmain,要么更改charTCHAR和。您应该始终使用基于 - 的设施,或者根本不使用。printf_tprintfTCHAR

很明显,您正在构建一个 Unicode 构建,并且传递给您的参数是wchar_t*指针,而不是char*. 通过将它们视为char*,您的程序会表现出未定义的行为。

于 2013-08-10T17:44:48.863 回答
1

问题是,您使用的可能是 Uni-Code 字符集。因此假定每个字符为 16 位(宽字符)。但是您解析的字符只有 8 位,因此您将较低的 8 位放入 16 位区域。你让其他 8 位免费。因此,在您的应用程序中,您将其视为非宽字符数组,并且您正在读取每个字节的字节,因此您获得了前 8 位,第二次您正在从未初始化的块中读取,这可能只是 0000 0000 (在你的情况下会设置一个 '\0' 标记)但它可以是任何东西,因为你还没有放入一些东西。

解决此问题的最佳方法是(到目前为止,您不希望使用宽字符)只需进入您的 MSVC 项目属性,然后在 General->CharacterSet 下选择“使用多字节字符集”而不是“使用 unicode” . 然后你应该把 main 重命名为“main”,它应该在你的问题范围内工作。

于 2013-08-11T15:24:51.037 回答