2

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

4

3 回答 3

6

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

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

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

于 2012-10-24T11:04:25.693 回答
2

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

于 2012-10-24T11:06:37.307 回答
0

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

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

注意大写的“S”。如果你用小写的 's' 代替它,它只会打印第一个字符。这就是宽字符的工作原理。你应该在 msdn 论坛上阅读更多关于它们的信息。

于 2012-10-24T11:06:02.107 回答