Printf和cout只打印args cpp的第一个字符

时间:2013-08-10 12:43:16

标签: c++ visual-studio args

我可能完全忽略了这一点,但我有以下方法在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字符。

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

我唯一能想到的是因为fu的大小在编译时是已知的,并且argv的大小并不像编译它的方式那样有趣。

我知道我可以通过循环遍历字符打印出内容,但这似乎打败了这一点,例如,如果我想使用字符串进行比较或者什么的话。有人可以解释一下发生了什么吗?

2 个答案:

答案 0 :(得分:1)

_tmain更改为main,或将char更改为TCHAR,将printf更改为_tprintf。您应该始终如一地使用基于TCHAR的设施,或者根本不使用。

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

答案 1 :(得分:1)

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

解决这个问题的最好方法是(到目前为止你没有使用宽字符)只需进入你的MSVC项目属性,然后选择General-&gt; CharacterSet“使用多字节字符集”代替“使用unicode”。 然后你应该将main重命名为“main”,它应该在你的问题范围内工作。