/*
下面的程式碼計算一段ASCII文字的寬度。
每個字元可以設定不同的長度。
*/
#include
#define TAB_WIDTH 8 //假設製表符的寬度為8
#define ENTER_WIDTH 0 //假設回車符的寬度為0
#define ALARM_WIDTH 0 //假設警示符的寬度為0
int cl[256];
size_t digMaxWidth(char const * str)
{
char * b;
char * e;
size_t ml;
size_t l;
if(str==NULL)
return 0;
l=strlen(str);
b=(char *)malloc(l+1);
memcpy(b,str,l+1);
e=b;
str=b;
for (;*e;e++)
if(*e=="\b")
if(b>str)
b--;
}
else
*b=*e;
b++;
*b=0;
for(b=str,ml=0,l=0;*b;b++)
if(*b=="\n")
ml=ml>l?ml:l;
l=0;
l+=cl[*(unsigned char const *)b];
free(str);
return ml;
int main()
int c;
for(c=1;c<256;c++) /*預設每隔字元寬度為1*/
cl[c]=1;
cl[0]=0;
cl["\t"]=TAB_WIDTH; /*製表符寬度*/
cl["\r"]=ENTER_WIDTH; /*回車符寬度*/
cl["\a"]=ALARM_WIDTH; /*警示符寬度*/
/*...*/
printf("%d\n",digMaxWidth("123\n4567\n12\nABCDEF"));
printf("%d\n",digMaxWidth("123\b\b\b\b\b\b\n4560007\n12\n\bABCDEF"));
/*
下面的程式碼計算一段ASCII文字的寬度。
每個字元可以設定不同的長度。
*/
#include
#include
#include
#include
#define TAB_WIDTH 8 //假設製表符的寬度為8
#define ENTER_WIDTH 0 //假設回車符的寬度為0
#define ALARM_WIDTH 0 //假設警示符的寬度為0
int cl[256];
size_t digMaxWidth(char const * str)
{
char * b;
char * e;
size_t ml;
size_t l;
if(str==NULL)
return 0;
l=strlen(str);
b=(char *)malloc(l+1);
memcpy(b,str,l+1);
e=b;
str=b;
for (;*e;e++)
{
if(*e=="\b")
{
if(b>str)
b--;
}
else
{
*b=*e;
b++;
}
}
*b=0;
for(b=str,ml=0,l=0;*b;b++)
{
if(*b=="\n")
{
ml=ml>l?ml:l;
l=0;
}
else
l+=cl[*(unsigned char const *)b];
}
free(str);
ml=ml>l?ml:l;
return ml;
}
int main()
{
int c;
for(c=1;c<256;c++) /*預設每隔字元寬度為1*/
cl[c]=1;
cl[0]=0;
cl["\t"]=TAB_WIDTH; /*製表符寬度*/
cl["\r"]=ENTER_WIDTH; /*回車符寬度*/
cl["\a"]=ALARM_WIDTH; /*警示符寬度*/
/*...*/
printf("%d\n",digMaxWidth("123\n4567\n12\nABCDEF"));
printf("%d\n",digMaxWidth("123\b\b\b\b\b\b\n4560007\n12\n\bABCDEF"));
return 0;
}