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

时间:2012-10-24 10:53:44

标签: c++ c visual-studio-2010 visual-c++

  

可能重复:
  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")中,但它没有帮助。

3 个答案:

答案 0 :(得分:6)

使用_tprintf代替printf。您的程序几乎肯定会被编译为UNICODE,因此,每个"字符"占用两个字节。

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

并确保您的argv被声明为TCHAR而不是char。要保持一致:使用TCHAR例程,或者不要使用{{1}}例程。但除非你有一个非常良好的理由(即你知道你正在做什么以及你正准备做一些魔术),否则不要混在一起。你可能没有机会,你不应该这样做。

答案 1 :(得分:2)

Visual Studio C ++有一种处理Unicode支持的特殊方法。 tchar.h中的宏扩展为符号的普通或宽字符版本,具体取决于项目设置。因此_tprintf扩展为printfwprintf。您似乎正在尝试使用printf,如果您的项目设置启用了Unicode支持,那么您遇到的问题就是预期的问题。看一下tchar.h,然后尝试使用_tprintf

答案 2 :(得分:0)

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

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

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