| |||
| 有以下一段程序: void CFileDlgTestDlg::ReplaceToZero(const CString &str, const CString &strFrom, char *pResult) { int pos1=0,pos2=0; int cur=0,len=strFrom.GetLength(); while((pos2=str.Find(strFrom,pos1))!=-1) { while(pos2>pos1) pResult[cur++]=str[pos1++]; pResult[cur++]='\0'; pos1=pos2+len; } } 作用是把str里的指定字符(也就是strFrom)替换成ASCII码为0的字符,把结果传给pResult。但是调用的时候是ReplaceToZero(m_strFilter,"\\0",cBuffer),目的是把m_strFilter中的"\"和"0"的组合替换成ASCII码为0的字符。但为什么第2个参数是"\\0"而不是"\0"呢?我用"\0"时出现非法操作的。 |
| |||
| 不是常见书。这本书挺烂的。但初学比较容易上手,但是作者的错误好像也挺多(未经证实)。 这个程序的目的是利用各种参数显示不同风格的CFileDialog。其中一个combo控件和一个CString变量绑定,作用是选择过滤字符串。主对话框上有个按钮,按了它就构造一个CFileDialog,并传递给它参数,并让它显示。用UpdateData函数把combo控件内的字符串传递给那个绑定的CString变量。书上说:用户在“过滤字符串”编辑框输入了“\0”,本意是表示ASCII码为0的那个字符,但字符串保存在CString类型的关联变量却变成了字符“\”和字符“0”,而在一个CString类型的变量中“\”是没有转义作用的(原文如此),这样就需要一个专门的函数来把字符“\”和“0”的组合替换成ASCII码为0的字符(也就是ReplaceToZero函数)。但是书上在传递参数时却用"\\0"作为第2个参数,所以让我感到奇怪了。 |
| |||
| 既然把我的问题专门列出来了,那我也干脆把我已经有些搞明白的问题自圆其说一下吧。造成这个问题的原因有二。一是这本书本身就说错了,误导了我。其二是我没有真正明白转义字符的含义。转义字符是为了让编译器使用的。比如这个问题,之所以代参数时用"\\0",是因为代参数是要通过编译器检测的,这里必须让编译器知道我代的参数其实是"\"和ASCII0。而用UpdateData函数像绑定的变量传值,变量获得值时编译器根本就没有做任何事,其实这是程序本身的事,而程序本身不把"\"当作转义字符看,所以如果要让程序把CString变量中的"\"当作转义字符就需要自己编函数了。可能我的表达方面有些问题,但大体意思就是这样。 |
| |||
| 引用:
|