我在做一个文本转换程序,我现在是将转换过程放在后台,我在转换函数中调用全局
函数时出了问题,比如调用这样的函数:
UINT GenerateHTML(CString &lparam)
{
for(int i=0;i<lparam.GetLength();i+=2){
if(lparam.Mid(i,2)=="±")
lparam.Delete(i,2);
         }
         lparam+="&nbsp";
}
这样这个函数就无法正常工作,for语句中在文本的一万多行才找倒"±",而去掉
lparam+="&nbsp";就可以正常工作了,请教这是怎么回事?

解决方案 »

  1.   

    i+=2???        你的意思是他是一个32位的UNICODE字符?那你下面lparam+="&nbsp"又是16位的非UNICODE字符,这可能有点问题吧!我记得把字符串当作UNICODE字符的话,可以在前面加L,ex.
    L"xxxxx"
    我也不知道对不对。
      

  2.   

    if(lparam.Mid(i,2)=="±")
    改成
       if(lparam.Mid(i,2)==L"±")
      

  3.   

    如果你的lparam是一个多字节字符串,则需将i+=2改成i++,因为多字节时有些字符两个字节长而有些则一个字节长,所以应该i++。如果是UNICODE,则上面的代码没错误,不用加L,CString自动封装了宽字节和多字节之间的转换,所以我以为楼主的lparam是多字节的,而之所以去掉"&nbsp"等正常,认为是由于"&nbsp"是5个字节长的,所以每次调用这个函数时,都使得i有可能撞对,即正好i及i+1表示"±",而不是i-1及i表示"±"。
      

  4.   

    我使用fgets,每次只读如一行文本,并将该文本传给该函数,每次进入循环时,lparam都有所不同,因此在字符串的最后加&nbsp我觉的应该没有影响.请大家多指教.
      

  5.   

    楼主有将i+=2改成i++试过吗?
    因为楼主用多字节编码,"±"并不能保证每次都落在偶数边界上,所以不能用i+=2如果楼主的lparam每次都只是一行??那“for语句中在文本的一万多行才找倒"±",”又怎能在一万多行才找到??
      

  6.   

    对不起,是我没有说清楚,我是循环调用该函数的,调用了一万多次,也就是
    读了一万多行,才找到。
    这个现在我也糊涂当时是怎么写的了,我现在是遇到第一个字节小于零的就
    加2,否则加1,只加1的话,Mid可能会越界,现在把它放在主函数里是行了,
    但不知有没有问题,以后看着再说吧,谢谢。