argv 只包含Visual C ++ 2010中第一个命令行参数的第一个字母

可能重复:
C ++中_tmain()和main()有什么区别?

我有一个控制台应用程序,它需要一个命令行参数。

int _tmain(int argc, char* argv[]) { ... printf("Path: %s\n", argv[1]); ... } 

当我使用参数( myprogram.exe D:\myfolder\myfile )运行程序时,它会打印Path: D而不是Path: D:\myfolder\myfile

我应该如何更改提取第一个命令行参数( argv[1] )的过程,以便它返回完整路径,而不仅仅是第一个字母?

我试图将路径放在引号( myprogram.exe "D:\myfolder\myfile" )中,但它没有帮助。

使用_tprintf而不是printf 。 您的程序几乎肯定会被编译为UNICODE ,因此每个“字符”占用两个字节。

你调用printf来操作单字节字符。 第二个字节恰好是0,因此printf认为它到达了字符串的末尾,因为零字节被认为是字符串的终止。

并确保您的argv声明为TCHAR而不是char 。 保持一致:要么使用TCHAR例程,要么不使用。 但是,除非你有充分的理由(即你知道自己在做什么,并且正准备做一些魔法),否则不要混淆。 你有可能没有,你不应该。

Visual Studio C ++有一种处理Unicode支持的特殊方法。 根据项目设置, tchar.h中的宏将扩展为符号的普通或宽字符版本。 所以_tprintf扩展为printfwprintf 。 看起来您正在尝试使用printf ,如果您的项目设置启用了Unicode支持,那么您遇到的问题就是预期的问题。 看看tchar.h并尝试使用_tprintf

在visual studio中,main函数通常占用wchar类型的参数。 如果是这种情况,请尝试通过wprintf函数输出:

 wprintf("Path : %S", argv[1]); 

请注意首都’S’。 如果用小写的’s’替换它,它将只打印第一个字符。 这就是宽字符的工作方式。 你应该在msdn论坛上阅读更多关于它们的内容。