可能重复:
What is the difference between _tmain() and main() in C++?
我有一个控制台应用程序,它接受一个命令行参数。
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"
)中,但它没有帮助。
答案 0 :(得分:6)
使用_tprintf
代替printf
。您的程序几乎肯定会被编译为UNICODE
,因此,每个"字符"占用两个字节。
您调用printf
对单字节字符进行操作。第二个字节恰好是0,因此printf
认为它到达了字符串的末尾,因为零字节被认为是字符串的终止。
并确保您的argv
被声明为TCHAR
而不是char
。要保持一致:使用TCHAR
例程,或者不要使用{{1}}例程。但除非你有一个非常良好的理由(即你知道你正在做什么以及你正准备做一些魔术),否则不要混在一起。你可能没有机会,你不应该这样做。
答案 1 :(得分:2)
Visual Studio C ++有一种处理Unicode支持的特殊方法。 tchar.h中的宏扩展为符号的普通或宽字符版本,具体取决于项目设置。因此_tprintf
扩展为printf
或wprintf
。您似乎正在尝试使用printf
,如果您的项目设置启用了Unicode支持,那么您遇到的问题就是预期的问题。看一下tchar.h,然后尝试使用_tprintf
。
答案 2 :(得分:0)
在visual studio中,main函数通常会占用wchar类型的参数。如果是这种情况,请尝试通过wprintf函数输出:
wprintf("Path : %S", argv[1]);
注意首都'S'。如果用小写的's'替换它,它将只打印第一个字符。这就是宽字符的工作方式。你应该在msdn论坛上阅读更多关于它们的信息。