首页 > 代码库 > 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++截取字符串,考虑中文情况避免乱码的方法。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。