字符串截断函数

襟前两抹唇脂晕 2009-08-25 09:42:36
各位,大虾!
小弟这厢有理啦。最近写了一个程序。遇到了一个问题:
屏幕宽度为21个字符宽。将一个字符串(长度不固定,可能少于21个字符,也可能多于21个,这里面包括中文汉字),
要求将这个字符串截断后,在屏幕上打印出来。在截断时,要求能够连续截断(截断后的字符串长度可以由一个参数确定),且中文汉字,不能被截断。
最好用C语言写出。我手中有一个函数,但不知为什么,有时打印后老是显示乱码。
由于是第一次发帖,也不知道怎么悬赏,大家可以告诉我,我会落实的。
//--------------------------------------------
//字符串折行函数
//汉字占两个字节,并且每个字节的最高位为“1”,所以都是负数
//name 为传递过来的字符串,长度不固定。store 为截取了一个长度为len 后的字符串。len 为要截取的长度。
void split_name( char * name , char * store , int len )
{
int i ,j , m ,n ;
char temp[251]={0};
i = 0 ;
m = name[i];
while( i < len && m!=0 )
{
n = name[i+1];
if ( m < 0 && n < 0 )
i = i + 2 ;
else
i = i + 1 ;
m = name[i];
}
i = i > len ? i-3 :i-1;
memset( store , 0 , sizeof( store ));
for(j=0 ;j<i+1 ;j++)
{
store[j]=name[j];
}
for(j=0 ;name[i+1]!='\0';i++)
{
temp[j++]=name[i+1];
}
for(j=0 ;temp[j]!='\0';j++)
{
name[j]=temp[j];
}
}
...全文
802 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
各位大侠,经过我的同事的不断努力,上面的问题,暂时得到了解决,解决的方法如下:
原因为:中文字符,在我们的设备里是两个正数。我们设备用的是裁剪过的Linux操作系统
//--------------------------------------------
//字符串折行函数
//汉字占两个字节,并且每个字节的最高位为“1”,所以都是负数
//name 为传递过来的字符串,长度不固定。store 为截取了一个长度为len 后的字符串。len 为要截取的长度。
void split_name( char * name , char * store , int len )
{
int i ,j , m ,n ;
char temp[251]={0};
i = 0 ;
m = name[i];
while( i < len && m!=0 )
{
n = name[i+1];
if (( m < 0 && n < 0 )||( m > 128 && n > 128 ) )
i = i + 2 ;
else
i = i + 1 ;
m = name[i];
}
i = i > len ? i-3 :i-1;
memset( store , 0 , sizeof( store ));
for(j=0 ;j <i+1 ;j++)
{
store[j]=name[j];
}
store[j]='\0';
for(j=0 ;name[i+1]!='\0';i++)
{
temp[j++]=name[i+1];
}
temp[j]='\0';
for(j=0 ;temp[j]!='\0';j++)
{
name[j]=temp[j];
}
name[j]='\0';
}
  • 打赏
  • 举报
回复
回复四楼的大虾:小弟我知识面比较窄,且非常笨,string 类中有字符串截取函数。我重来没用过,也不知 如何使用?不知您说的是哪种语言里面的。让您见笑了。
回复三楼的大虾:嗯,i-3,i-1的确可能是奇数。所以在截取的时候,截取的是前i+1个字符。
回复二楼的大虾:您说的有道理,我觉得也是这个循环的问题,但就是一头雾水,摸不着头绪,脑袋都胖了两圈。成了猪头喽。哈哈。
回复一楼的大虾:您说的汉字的区位码有可能超过整型的范围是吗?其实我也怀疑过这个问题。但又感觉不出到底有没有越界?真是连吃饭都觉得不香。wchar函数我还得查查。
多谢几位哥哥的指点。
MichaelBomb 2009-08-25
  • 打赏
  • 举报
回复
string类 不是有一个字符串截断的 直接调用看看
kakashi0309 2009-08-25
  • 打赏
  • 举报
回复

i = i > len ? i-3 :i-1; //这里有问题 如果都是汉字 i-3,i-1都是奇数 汉字肯定被截断了
sytstarac 2009-08-25
  • 打赏
  • 举报
回复
while( i < len && m!=0 )
{
n = name[i+1];
if ( m < 0 && n < 0 )
i = i + 2 ;
else
i = i + 1 ;
m = name[i];
}
感觉这个循环写的不好,i作为判断条件就要应该只在判断出变化,或者每次变化后都要判断。这里估计有数组越界了。比如i=len-1时,n值就无意义了。
jiayucunyan 2009-08-25
  • 打赏
  • 举报
回复
你的乱码问题,应该是将一个中文字符给截断了。

我觉得,一种方法你可以用,wchar来实现

另一种方法,使用char,这时判断是否为中文,因为中文的数值一般很大,这要看你输入的编码(比如gb,unicode)。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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