0

可能重复:
如何在 C 中转义或终止转义序列

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

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

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

输出应该是这样的:

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

如果我使用空格\0然后3D输出是:

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

1 回答 1

4

这里的问题是您不小心使用了八进制字符常量。当您编写时,\03D...您希望编译器将其解释为\0 3D.... 但是,编译器遵循规则并将其转换为\03 D.... 由于这不会产生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" );
于 2012-12-23T17:56:26.150 回答