易码技术论坛

 找回密码
 加入易码
搜索
查看: 165274|回复: 7

[求助]这个程序出了什么问题

[复制链接]
发表于 2004-12-18 21:43:00 | 显示全部楼层
程序我没仔细看了,但至少这里是有问题的:
char line[];
int i,n,k;
你这样并没有给line分配空间,所以程序一旦操作line时就会改变i,n,k的值,实际上line[0]就相当于i的低八位,余类推
 楼主| 发表于 2004-12-18 23:07:00 | 显示全部楼层
#define Height 13   //字高
char line[26];
int i,k;
long n;
void word(int x,int y,int s,int wide)
{
   for(i=1;i<=1+strlen(s)/26;i++)
      {
       for(n=0;n<wide-1;n++)
         {
          if(s+n<162)k++;
          }
       if((k/2)*2!=k && i<1+strlen(s)/26)
         {
          memmove(s+i*wide,s+i*wide-1,strlen(s)-i*wide+1);
          memset(s+i*wide-1,32,1);
          i=1;
          }
       memmove(line,s+(i-1)*wide,wide);
       TextOut(x,y+(i-1)*Height,line,1);
       }
getchar();
getchar();
s=0;
k=0;
line[wide]=0;
}
void main()
{
word(1,1,"四大皆空福利sdf发丝钉发丝钉发丝钉发丝钉丝钉发发丝钉发",26);
Refresh();
}
那么这样改呢
文本超过三行就会出错,而且判定s[n]全角和半角的功能根本就没用
发表于 2004-12-18 23:23:00 | 显示全部楼层
只有一个参数WIDE怎么控制每一行字数,您是不是想要文字到达屏幕边缘就自动转行那种模式?

14946_6072_6158.rar

2 KB, 下载次数: 257

 楼主| 发表于 2004-12-19 17:47:00 | 显示全部楼层
是要那种模式
怎么不行,把参数改了运行一下就看到效果了
现在的问题是如果一行内有奇数个半角字符的话会有半个全角字符在第一行,另外一半在第二行造成乱码,现在就要把那半个全角字符后移一位,再把它设成空格
发表于 2004-12-19 20:16:00 | 显示全部楼层
知道您的意思了,您是说wide变量控制所有行,在下以为可以弄出每一行的字数不一样呢~~晕~~
在下没有看懂您的程式,不过运行了,结果跟下面程式运行的结果一样:
void ShowMsg(int x,int y,int s,int wide)
{
int i,slen;
char line[27];
if (wide>26) return;
slen=strlen(s);
if (slen<=wide)
{
  TextOut(x,y,s,1);
}
else
{
  for (i=0;i<slen/wide;i++)
  {
   memmove(line,s,wide);
   line[wide]=0;
   TextOut(x,y+i*12,line,1);
   s=s+wide;
  }
  
}
}
void main()
{
//跟写者意志符合
ShowMsg(0,0,"哈哈哈哈",2);
Refresh();
getchar();
//跟写者意志不符
ShowMsg(0,0,"d哈哈哈",2);
Refresh();
getchar();
}
发表于 2004-12-19 20:44:00 | 显示全部楼层
如果,在下是说如果,您不嫌逐个字符处理慢的话,可以这样:
void ShowMsg(int x,int y,int s,int wide)
{
int bak_x,i,slen;
char str[3];
if (wide>26) wide=26;//强行处理大于屏幕边缘的情况
bak_x=x;//保留原始横坐标
for(;;)//开始进入循环
{
  str[0]=*s++;
  if (str[0]==0)return;//判断是否结束
  if (str[0]>0xA0)//汉字
  {
   if (x<wide*6-6)//注意这里减6的意义
   {
    str[1]=*s++;
    str[2]=0;
    TextOut(x,y,str,1);
    x=x+12;
   }
   else//换行
   {
    s--;
    x=bak_x;
    y=y+12;
   }
  }
  else
  {
   if (x<wide*6)
   {
    str[1]=0;
    TextOut(x,y,str,1);
    x=x+6;
   }
   else//换行
   {
    s--;
    x=bak_x;
    y=y+12;
   }
  }

}
}
这是在下个人理解您所需要的功能而写的,不知道跟您想的是否符合,函数初步测试没有问题~~

[此贴子已经被作者于2004-12-19 20:46:56编辑过]

1776_6174_738.rar

65 KB, 下载次数: 239

 楼主| 发表于 2004-12-20 13:17:00 | 显示全部楼层
非常感谢您的帮助,真是获益匪浅
 楼主| 发表于 2004-12-18 19:43:18 | 显示全部楼层 |阅读模式
#define Height 13   //字高
char line[];
int i,n,k;

void word(int x,int y,int s,int wide)
{
   for(i=1;i<=1+strlen(s)/26;i++)
      {
       for(n=0;n<wide;n++)
         {
          if(s+n<162)k++;
          }
       if((k/2)*2!=k)
         {
          memmove(s+i*wide,s+i*wide-1,strlen(s)-i*wide+1);
          memset(s+i*wide,32,1);
          i=0;
          }
       memmove(line,s+(i-1)*wide,wide);
       TextOut(x,y+(i-1)*Height,line,1);
       }
s=0;
k=0;
line[wide]=0;
}

void main()
{
word(1,1,"四大皆空福利sdf司肯德基甫洛lhlhkh",26);
Refresh();
}

TextOut功能不够强,自己做了个word(int x,int y,int s,int wide)可以输出多行文本,并设置每行字数,但是好像有极大的问题,大家帮忙看一下

[此贴子已经被作者于2004-12-18 19:48:52编辑过]

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 14:42 , Processed in 0.012762 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表