栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++获取含有中文的字符串长度

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++获取含有中文的字符串长度

在Windows下,中文字符在C++中的内存占用为2字节,此时采用字符串长度获取函数得到的结果会将一个中文字符识别为两个长度:

#include 
#include 
using namespace std;

int main()
{

int len;
char str1[50];

strcpy(str1,"abc中文def");//赋值

len = strlen(str1);
printf("字符串的长度为%d",len);
//使用strlen函数获取长度,结果为10

string str2 = "abc中文def";
len = str2.length();//也可以用len = str2.size();
printf("字符串的长度为%d",len);
//使用string类的长度获取函数length(),结果为10

len = sizeof(str1)/(char);
printf("字符串的长度为%d",len);
//使用sizeof运算符获取占用的内存,结果为10

}

而实际上,字符串的长度为8,并非上述方法的结果10。那么,如何获取真正的长度呢?

其实,我们不妨试试中文字符的值:

char a = '中';
std::cout << (int) a;

输出结果为:-48。

试试其他中文字符,也都是负数。

依据这一点,我们便可以做出一个获取含有中文的字符串长度的函数:

int lengthOfStr(string str)
{
	int count = 0;
	for (int i = 0; str[i]; i++)
	{
		if (str[i] < 0) i++;
        //负数说明该字符为中文字符,占用两个字节,跳过后一个字节(i++),不进行统计
		count++;
	}
    return count;
}

用前面的示例验证:

#include 
#include 
using namespace std;

int lengthOfStr(string str)
{
	int count = 0;
	for (int i = 0; str[i]; i++)
	{
		if (str[i] < 0) i++;
		count++;
	}
	return count;
}

int lengthOfStr_c(char str[])
{
	int count = 0;
	for (int i = 0; str[i]; i++)
	{
		if (str[i] < 0) i++;
		count++;
	}
	return count;
}

int main()
{

int len;

char str1[50] = "abc中文def";
string str2 = "abc中文def";

len = lengthOfStr_c(str1);
printf("字符串的长度为%d",len);

len = lengthOfStr(str2);
printf("字符串的长度为%d",len);

}

输出结果均为8。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022588.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号