首页 > 代码库 > C/C++截取字符串,考虑中文情况避免乱码的方法。

C/C++截取字符串,考虑中文情况避免乱码的方法。

#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;}

  

C/C++截取字符串,考虑中文情况避免乱码的方法。