hur.cn - 华软网

 热门搜索

Windows 字符串反转的问题

  作者:未知    来源:网络    更新时间:2010/11/27
C++">

#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;         //调式时候,这里会出现异常

大侠抢救呀!
---华软 网友回答---

PWSTR pWideCharStr = _T("String"); 
改成
wchar_t pWideCharStr[] = _T("String"); 
试试

pWideCharStr 指向的是常量,是不能改的。。。。
---华软网友回复---
还要把
printf("StringReverseW the pWideCharStr: %s",pWideCharStr)
改成
wprintf(_T("StringReverseW the pWideCharStr: %s"),pWideCharStr); 

否则输出的结果只有第一个字符。。。。
---华软网友回复---
PWSTR 与 wchar_t  如果在window xp 以上的平台表达意思不是一样的么?
改那儿肯定是不能到达效果的。

另有while (pWideCharStr < pEndOfStr)  这个表达什么意思,我陌生?麻烦也解释一下呀
---华软网友回复---
楼主没有试一下吗?
PWSTR == wchar_t  关头问题是
PWSTR pWideCharStr = _T("String"); 
指向的字符串是在全局数据段中,是只读的,禁止对它修改的
改成
wchar_t pWideCharStr[] = _T("String");
后,字符串是放在栈里了,堆栈里的数据是能够修改的

while (pWideCharStr < pEndOfStr)
是把第一个字符和最后一个字符对调,第二个字符和倒数第二个字符对调,。。。。
楼主仔细读一下程序,慢慢就明白了
---华软网友回复---
PWSTR pWideCharStr = _T("String"); 
-->
WCHAR pWideCharStr[] = {_T("String")}; 
---华软网友回复---
  class="deleted_message"> 该回复于2010-11-29 14:01:58被版主删除
---华软网友回复---
嗯嗯。查了一下书。书上说:"string" ,为字面值常量,是不能对字面值常量举行修改的。


C++primer》说的,呵呵给忘了。

while (pWideCharStr < pEndOfStr)这个我感觉:pWideCharStr的值刚起头为所指向的整个字符串,而pEndOfStr为字符串最后面的字符,所以能够这样对照。然后每次它们移位操作,也是这样对照。

呵呵,不知道对不对哦。谢谢楼上帮助。
如果理解有错,麻烦指出呀。
---华软网友回复---
引用 7 楼 justinlm 的回复:
嗯嗯。查了一下书。书上说:"string" ,为字面值常量,是不能对字面值常量举行修改的。


C++primer》说的,呵呵给忘了。

while (pWideCharStr < pEndOfStr)这个我感觉:pWideCharStr的值刚起头为所指向的整个字符串,而pEndOfStr为字符串最后面的字符,所以能够这样对照。然后每次它们移位操作,也是这样对照。

呵呵,不知道……


上面貌似写错了,应该是pWideCharStr的地址比pEndOfStr的地址小吧。
不知道对不对      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。