码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-01-28 14:29:27      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

#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++截取字符串,考虑中文情况避免乱码的方法。

标签:

原文地址:http://www.cnblogs.com/hxb316/p/4255627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!