求字符串长度

tanwei1002 2009-10-28 09:59:55
如CString str =“a44bc123阿萨德【】[]”;str中含有中文,英文和符号等

如何取出最后10个字呢。

不是字符,是字。中文,英文都算一个字
...全文
808 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Carmack Jiang 2009-10-29
  • 打赏
  • 举报
回复

CString str ="a44bc123阿萨德【】[]";
int nLastWord = 10;
int i=str.GetLength() - 1;
CString sResult;
while(i >= 0 && nLastWord > 0)
{
if(str[i]>=0xa0)//全角,中文
{
sResult+=str[i];
sResult+=str[i - 1];
i = i - 2;
}
else//半角,英文
{
sResult+=str[i];
i --;
}
nLastWord -- ;
}
CString sNewstr;
for(i =0;i < sResult.GetLength();i ++)
sNewstr += sResult[sResult.GetLength() - 1 -i];
tanwei1002 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 appearance 的回复:]
C/C++ code
CString str="a44bc123阿萨德【】[]";int nLastWord=10;int i=str.GetLength()-1;
CString sResult;while(i>=0&& nLastWord>0)
{if(str[i]>=0xa0)//全角,中文 {
sResult+=st¡­
[/Quote]

这样的结果不是最后十个字
如“a44bc123阿萨德【】[]” ,最后10个字应该为“123阿萨德【】[]”
这个跟编码格式有关 前面几楼有高手指点了
谢谢你了
cloudyi 2009-10-28
  • 打赏
  • 举报
回复
从字符串的最右边操作判断当前序号的字符是英文还是中文或者是其它符号, 如果是英文或者中文就将计数器加1, 当计数值为10后就停止操作:
CString sourceStr;//源字符串
sourceStr.MakeLower();//转为小写
BYTE count = 0;
char result[20] = {0};
int len = sourceStr.GetLength();
for(int i = len - 1; i >= 0; i --)
{
//英文字符
if(sourceStr[i] >= 'a' && sourceStr[i] <= 'z')
{
result[count] = sourceStr[i];
count ++;
}
//中文(占两个字节)
else if((sourceStr[i] & 0x80) && i < len - 1)
{
result[count] = sourceStr[i];
result[count + 1] = sourceStr[i + 1];
count ++;
}
if(count >= 10)
break;
}
//读取结果时, 直接对result字符数组从序号i=0开始判断即可
tanwei1002 2009-10-28
  • 打赏
  • 举报
回复
xiexie 大家了

这问题已经解决了 3Q
bobob 2009-10-28
  • 打赏
  • 举报
回复
有个api判断一个字节是不是双字节的第一个字节,叫IsDBbytelead什么的,你查一下吧
ct025028 2009-10-28
  • 打赏
  • 举报
回复
首先要确定你使用的是什么字符集,如果是uniceode的话,每个字符占两个字节,如果是utf-8的话,英文字符占一个字节,中文一般是三个字节,不同的字符集有自己的编码规范。

确定了字符集后,再根据这种字符集的编码规范就可以分析出每一个字符(英文,中文)
向立天 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tanwei1002 的回复:]
引用 4 楼 starytx 的回复:
从右往左循环判断是否是汉字或英文字母,判断的过程中进行计数,超过10个就退出循环


那怎么判断呢
可能有汉字啊。。。
[/Quote]

判断字符是不是大于7F
大于7F就不是ASCII码
这时过两个字符也就是一个非ASCII符号
starytx 2009-10-28
  • 打赏
  • 举报
回复
C++判断一个char字符串,下标为N是不是汉字.
思路:
C++中的通用方法是判断这个char的最高位是不是为1,因为英文字符的值一定小于0x80,即最高们是0,而中文字符(所占的两个字符都是)的最高位是1.
(但有些特殊字符也是1,比如:★(A1EF、U+2605)等等这些字符。应当注意).


//代码示例:
char * str[50] = “test!我们test.”;

if(str[i] & 0x80 )
// 下标为 i 是个中文字符(或半个中文字符);
else
// 下标为 i 是个英文字符;

//下面是我常用的取字符串位置的函数
int GetCharPos(const string &str, int pos)
{
int i = 0;
for (; i < (int)str.size() && i < pos; ++i)
{
if (str[i] & 0x80)
++i;
}
return i;
}
tanwei1002 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 starytx 的回复:]
从右往左循环判断是否是汉字或英文字母,判断的过程中进行计数,超过10个就退出循环
[/Quote]

那怎么判断呢
可能有汉字啊。。。
chenjingdefeng 2009-10-28
  • 打赏
  • 举报
回复
一个汉字占两个字节。这样你用substr=str.right(20);试试
starytx 2009-10-28
  • 打赏
  • 举报
回复
从右往左循环判断是否是汉字或英文字母,判断的过程中进行计数,超过10个就退出循环
tanwei1002 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tanwei1002 的回复:]
引用 1 楼 taoshengyijiu20008 的回复:
substr=str.right(10);


不是求最后10个字符。。。。。

是最后10个字啊
[/Quote]


说错了 不是最后10个字节

是10个字
中文,英文都算一个字的
tanwei1002 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taoshengyijiu20008 的回复:]
substr=str.right(10);
[/Quote]

不是求最后10个字符。。。。。

是最后10个字啊
岁月小龙 2009-10-28
  • 打赏
  • 举报
回复
substr=str.right(10);
ct025028 2009-10-28
  • 打赏
  • 举报
回复
http://blog.csdn.net/tangaowen/archive/2008/06/11/2535370.aspx

上面的问题和你的差不多,有程序

另外要区分gbk以及gb18030,他们是gb2312的超集,下面的一段话从百度百科找的,祝你成功:
http://baike.baidu.com/view/1250144.htm

GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。
tanwei1002 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ct025028 的回复:]
纠正一点,如果说中文占两个字节绝对是错误的,前面已经说过不同的字集有不同的规范,比如说utf-8编码,三字节表示一个汉字,第一字节为1110....,第二字节为10.....,第三字节为10.....,而gb2312则又不同,他两字节表示一汉字,但他有一个汉字的编码范围。都不知道是什么编码,谈何分离每一个字符?


我不知道楼主弄这个有什么用,如果要分离每一个字符的话,应当首先确定字符串的编码方式,确定后再说怎么分离的问题。
[/Quote]


是GB2312 编码
我想得到最后的几个字
3jaja 2009-10-28
  • 打赏
  • 举报
回复
char *pc="a44bc123阿萨德【】[]";
char *p = pc;
while(*p)
{
if( *p < 0 ) break;
p ++;
}
//p就是中文开始了
ct025028 2009-10-28
  • 打赏
  • 举报
回复
纠正一点,如果说中文占两个字节绝对是错误的,前面已经说过不同的字集有不同的规范,比如说utf-8编码,三字节表示一个汉字,第一字节为1110....,第二字节为10.....,第三字节为10.....,而gb2312则又不同,他两字节表示一汉字,但他有一个汉字的编码范围。都不知道是什么编码,谈何分离每一个字符?


我不知道楼主弄这个有什么用,如果要分离每一个字符的话,应当首先确定字符串的编码方式,确定后再说怎么分离的问题。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧