如何使用ofn.lpstrFilter中的数字启动文件格式名称?它不允许在开始时写3?

时间:2012-12-23 16:43:29

标签: c++ c winapi

  

可能重复:
  How to escape or terminate an escape sequence in C

ofn.lpstrFilter不允许我在分机开头写下数字“3”?我需要使用哪种过滤器?

ofn.lpstrFilter = "text1 (*.txt)\0*.txt\03D text (*.txt)\0*.txt\0";

在上面的例子中,就在\0之后,我正在使用3D,但是lpstrFilter不允许我。为什么?我不想在它们之间使用空间。

输出应该是:

text1 (*.txt)
3D text (*.txt)

如果我在\03D之间使用空格,则输出为:

text1 (*.txt)
 3D text (*.txt)  // note one space is added before 3D

1 个答案:

答案 0 :(得分:4)

这里的问题是你不小心使用了octal character constant。当您编写\03D...时,您希望编译器将其解释为\0 3D...。但是,编译器遵循规则并将其转换为\03 D...。由于这不会产生NUL字符,因此前面的*.txt扩展名会延伸到下一个\0字符。以下*.txt扩展名现在被误解为显示字符串,它将很乐意显示在文件类型下拉列表中。

解决方案是拆分字符串并写下以下代码:

ofn.lpstrFilter = "text1 (*.txt)\0*.txt\0" "3D text (*.txt)\0*.txt\0";

这将正确终止\0,并防止将以下数字字符解释为此转义序列的一部分。

顺便说一句,由于这是WinAPI代码,您应该使用TCHAR而不是char s。然后代码行如下所示:

ofn.lpstrFilter = _T( "text1 (*.txt)\0*.txt\0" ) _T( "3D text (*.txt)\0*.txt\0" );