#include "stdafx.h"BOOL StringReverseW(PWSTR pWideCharStr, DWORD cchLength);int _tmain(int argc, _TCHAR* argv[])
{
PWSTR pWideCharStr = _T("String");

StringReverseW(pWideCharStr,8);
printf("StringReverseW the pWideCharStr: %s",pWideCharStr);

return 0;
}//宽字节字符串颠倒算法
BOOL StringReverseW(PWSTR pWideCharStr, DWORD cchLength) {   // Get a pointer to the last character in the string.   cchLength:最大允许的字节数
   PWSTR pEndOfStr = pWideCharStr + wcsnlen_s(pWideCharStr , cchLength) - 1;
   wchar_t cCharT;
   // Repeat until we reach the center character in the string.
   while (pWideCharStr < pEndOfStr) {     //我不知道为什么是这么判断,感觉这样不对呀?
      // Save a character in a temporary variable.
   cCharT = *pWideCharStr;      // Put the last character in the first character.
      *pWideCharStr = *pEndOfStr;         //调式时候,这里会出现异常      // Put the temporary character in the last character.
      *pEndOfStr = cCharT;      // Move in one character from the left.
      pWideCharStr++;      // Move in one character from the right.
      pEndOfStr--;
   }   // The string is reversed; return success.
   return(TRUE);
}while (pWideCharStr < pEndOfStr)    //我不知道为什么是这么判断,感觉这样不对呀?  *pWideCharStr = *pEndOfStr;         //调式时候,这里会出现异常大侠急救呀!

解决方案 »

  1.   


    PWSTR pWideCharStr = _T("String"); 
    改成
    wchar_t pWideCharStr[] = _T("String"); 
    试试pWideCharStr 指向的是常量,是不能改的。
      

  2.   

    还要把
    printf("StringReverseW the pWideCharStr: %s",pWideCharStr)
    改成
    wprintf(_T("StringReverseW the pWideCharStr: %s"),pWideCharStr); 否则输出的结果只有第一个字符。
      

  3.   

    PWSTR 与 wchar_t  如果在window xp 以上的平台表达意思不是一样的么?
    改那儿肯定是不能达到效果的。还有while (pWideCharStr < pEndOfStr)  这个表达什么意思,我不懂?麻烦也解释一下呀
      

  4.   

    楼主没有试一下吗?
    PWSTR == wchar_t  关键问题是
    PWSTR pWideCharStr = _T("String"); 
    指向的字符串是在全局数据段中,是只读的,禁止对它修改的
    改成
    wchar_t pWideCharStr[] = _T("String");
    后,字符串是放在栈里了,堆栈里的数据是可以修改的while (pWideCharStr < pEndOfStr)
    是把第一个字符和最后一个字符对换,第二个字符和倒数第二个字符对换,。
    楼主仔细读一下程序,慢慢就明白了
      

  5.   

    PWSTR pWideCharStr = _T("String"); 
    -->
    WCHAR pWideCharStr[] = {_T("String")}; 
      

  6.   

    嗯嗯。查了一下书。书上说:"string" ,为字面值常量,是不能对字面值常量进行修改的。
    《C++primer》说的,呵呵给忘了。while (pWideCharStr < pEndOfStr)这个我感觉:pWideCharStr的值刚开始为所指向的整个字符串,而pEndOfStr为字符串最后面的字符,所以可以这样比较。然后每次它们移位操作,也是这样比较。呵呵,不知道对不对哦。谢谢楼上帮助。
    如果理解有错,麻烦指出呀。
      

  7.   


    上面貌似写错了,应该是pWideCharStr的地址比pEndOfStr的地址小吧。
    不知道对不对