Possible Duplicate:
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

最佳答案

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

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

这将正确终止\0,并防止以下数字字符被解释为此转义序列的一部分。
另外,由于这是WinAPI代码,您可能应该使用TCHARs而不是chars
ofn.lpstrFilter = _T( "text1 (*.txt)\0*.txt\0" ) _T( "3D text (*.txt)\0*.txt\0" );

09-16 08:40