#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void newlineStr(const char *lpszData, int nLineMaxLen)
{
if (NULL == lpszData || 0 >= nLineMaxLen)
{
return;
}
int nLen = strlen(lpszData);
//递归出口
if (nLen <= nLineMaxLen)
{
//可替换为别的有用的函数
printf("lpszLine1:%s\n", lpszData);
return;
}
int i = 0; //字符串移动下标
int k = 0; //记录要截取的长度
// 字段最后一位不是汉字,则直接截取
if ((unsigned char)(lpszData[nLineMaxLen - 1]) < 0xA0)
{
k = nLineMaxLen;
}
// 字段最后一位是汉字,而倒数第二位不是汉字则直接截取到倒数第二位
else if ((unsigned char)(lpszData[nLineMaxLen - 1]) >= 0xA0
&& (unsigned char)(lpszData[nLineMaxLen - 2]) < 0xA0)
{
k = nLineMaxLen - 1;
}
// 从头开始一个个字符的判断,
// 看最后一个字符是属于要截取的汉字的一部分,
// 还是不属于截取的范围
else
{
while ( i < nLineMaxLen)
{
if ((unsigned char)(lpszData[i]) >= 0xA0
&& (unsigned char)(lpszData[i + 1]) >= 0xA0)
{
if (k+2 <= nLineMaxLen)
{
k += 2;
i += 2;
}
else
{
break;
}
}
else
{
if (k+1 <= nLineMaxLen)
{
k++;
i++;
}
else
{
break;
}
}
}
}
char *lpszLine = (char *)malloc(nLineMaxLen + 1);
if (NULL == lpszLine)
{
printf("\nout of memory\n");
return;
}
memset(lpszLine, '\0', nLineMaxLen + 1);
strncpy(lpszLine, lpszData, k);
//可替换为别的有用的函数
printf("lpszLine2:%s\n", lpszLine);
// 先释放内存再递归,减少内存占用
if (NULL != lpszLine)
{
free(lpszLine);
lpszLine = NULL;
}
//移动下一个点继续递归
newlineStr(lpszData + k, nLineMaxLen);
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
newlineStr("2007/08/13 16:32:12", 11);
newlineStr("测试通知公告", 4);
newlineStr("测试通知公告是否成功呵呵", 16);
system("pause");
return 0;
}