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
扩展为printf
或wprintf
。 看起来您正在尝试使用printf
,如果您的项目设置启用了Unicode支持,那么您遇到的问题就是预期的问题。 看看tchar.h并尝试使用_tprintf
。
在visual studio中,main函数通常占用wchar类型的参数。 如果是这种情况,请尝试通过wprintf函数输出:
wprintf("Path : %S", argv[1]);
请注意首都’S’。 如果用小写的’s’替换它,它将只打印第一个字符。 这就是宽字符的工作方式。 你应该在msdn论坛上阅读更多关于它们的内容。