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

本文介绍了一个使用C++实现的字符串拆分函数,该函数能够处理包含中文字符的字符串,并将其按照指定的最大长度进行拆分。通过递归的方式实现了字符串的逐段截取,并考虑了中文字符的完整性和内存分配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  

转载于:https://www.cnblogs.com/hxb316/p/4255627.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值