c程序 如何判断字符串末尾半个汉字时,将最后的半个汉字删掉。否则不做操作?

把一个字符串按一定长度截取后,如果前面的字符串中有半角字符或字母等等,最后一个汉字会出现半个汉字的乱码。我想如果遇到这种情况,把最后的半个汉字删掉。如果没有出现这种情况,则不做操作。
我在网上找到这个样一下这个方法。如果遇到字符串末尾是半个汉字会把它删掉,但是如果字符串末尾不是半个汉字,它也会删除半个汉字。导致原本正常的字符串,最后又变成乱码了。不知道是什么缘故,有没有谁可以帮忙看看呢?

int chkHalfChinese(char * buf,int len)
{
int i = 0;
int cnt = 0;
for(i=len-1;i>=0;i--) {
if(buf[i] < 160) break;
if(buf[i] > 160) cnt++;
}
if(cnt%2) {
buf[len-1] = 0x00;
return(1);
}
else
return(0);
}

通常情况下,如果是标准的汉字,按照c语言处理汉字的方法,即一个汉字占2个字符长度。

因此,处理字符串时,应从字符串的开始计数,
如果字符的ascii码值大于128则为汉字的一部分, 2个连续的ascii码值大于128的字符组成一个汉字。

上述程序就是这个思路,不过应该改进一下,由字符串的头开始,而不是从结尾开始。

int chkHalfChinese(char * buf,int len)
{
int i = 0;
int cnt = 0;
int idx;
for(i=0;i<len;i++)
{
if(buf[i] > 128)
{
cnt++;
idx=i;
}
}

if(cnt%2)
{
buf[idx] =' ';
return(1);
}
else
return(0);
}

其中idx是记录最后一个ascii码大于128的字符,如果cnt是奇数,则说明该字符是多余的,将其赋值为空字符。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-14
if (buff[len-1] <= 0xA0) return 0; // 把 break 行移出来
最后一个不是GB码,直接返回。
for(i=len-1;i>=0;i--) {
if(buf[i] > 160) cnt++; // GB计数
}
if(cnt%2) ..... 不变
第2个回答  2010-07-14
从后面向前面第一个小于160的字节后数大于160的字节的个数,如果是奇数就是有半个汉字,反之则没有。
第3个回答  2010-07-14
不要用char类型,用wchar_t类型就可以很好地处理上述问题了。
你以wchar为关键字搜索一下就行了。