函数先放出来了:
int lengthOfStr(string str) { int count = 0; for (int i = 0; str[i]; i++) { if (str[i] < 0) i++; //负数说明该字符为中文字符,占用两个字节,跳过后一个字节(i++),不进行统计 count++; } return count; }
不想引用<string>头的可以用char数组:
int lengthOfStr_c(char str[]) { int count = 0; for (int i = 0; str[i]; i++) { if (str[i] < 0) i++; count++; } return count; }
----------------------------------
在Windows下,中文字符在C++中的内存占用为2字节,此时采用字符串长度获取函数得到的结果会将一个中文字符识别为两个长度:
#include <stdio.h> #include <string> using namespace std;//string在std命名空间中 int main() { string str = "abc中文def"; printf("字符串为:%s\n", str.data());//data()函数回传字符串的指针,与c_str()相同 int len; char str1[50]; strcpy(str1, str.data());//赋值 len = strlen(str1); printf("字符串的长度为(%d)\n", len); //使用strlen函数获取长度 string str2 = str;//也可以用string str2.assign(str),这是string的赋值函数,不过和=没区别 len = str2.length();//也可以用len = str2.size(); printf("字符串的长度为(%d)\n", len); //使用string类的长度获取函数length() system("pause"); }
输出:
字符串为:abc中文def 字符串的长度为(10) 字符串的长度为(10) 请按任意键继续. . .
而实际上,字符串的长度为8,并非上述方法的结果10。那么,如何获取真正的长度呢?
其实,我们不妨试试中文字符的值:
char a = '中'; char b = '文'; char c = '字'; char d = '符'; printf("字符‘中’在编码中的值为%d\n",(int)a); printf("字符‘文’在编码中的值为%d\n",(int)b); printf("字符‘字’在编码中的值为%d\n",(int)c); printf("字符‘符’在编码中的值为%d\n",(int)d); system("pause");
输出:
字符‘中’在编码中的值为-48 字符‘文’在编码中的值为-60 字符‘字’在编码中的值为-42 字符‘符’在编码中的值为-5 请按任意键继续. . .
试试其他中文字符,也都是负数。
依据这一点,我们便可以做出一个获取含有中文的字符串长度的函数:
string版:
int lengthOfStr(string str) { int count = 0; for (int i = 0; str[i]; i++) { if (str[i] < 0) i++; //负数说明该字符为中文字符,占用两个字节,跳过后一个字节(i++),不进行统计 count++; } return count; }
char版: 虽然char数组也可以传入上面的函数,不过为了避免某些奇葩编译器,还是再写了一个函数,即拷即用:
int lengthOfStr_c(char str[]) { int count = 0; for (int i = 0; str[i]; i++) { if (str[i] < 0) i++; count++; } return count; }
不过,char版不可以传string。
用前面的示例验证:
#include <stdio.h> #include <string> using namespace std; int lengthOfStr(string str) { int count = 0; for (int i = 0; str[i]; i++) { if (str[i] < 0) i++; //负数说明该字符为中文字符,占用两个字节,跳过后一个字节(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() { string str = "abc中文def"; printf("字符串为:%s\n", str.data());//data()函数回传字符串的指针,与c_str()相同 int len; char str1[50]; strcpy(str1, str.data());//赋值 len = strlen(str1); printf("字符串的长度为(%d)\n", len); //使用strlen函数获取长度 len = lengthOfStr_c(str1);//len = lengthOfStr(str1); printf("字符串的长度为[%d]\n", len); //用上面的函数获取含有中文字符的字符串的真正长度 string str2 = str;//也可以用string str2.assign(str),这是string的赋值函数,不过和=没区别 len = str2.length();//也可以用len = str2.size(); printf("字符串的长度为(%d)\n", len); //使用string类的长度获取函数length() len = lengthOfStr(str2); printf("字符串的长度为[%d]\n", len); //用上面的函数获取含有中文字符的字符串的真正长度 system("pause"); }
输出:
字符串为:abc中文def 字符串的长度为(10) 字符串的长度为[8] 字符串的长度为(10) 字符串的长度为[8] 请按任意键继续. . .
这个函数也可以获取没有中文字符的字符串长度:
#include <stdio.h> #include <string> using namespace std; int lengthOfStr(string str) { int count = 0; for (int i = 0; str[i]; i++) { if (str[i] < 0) i++; //负数说明该字符为中文字符,占用两个字节,跳过后一个字节(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() { string str = "abcdef"; printf("字符串为:%s\n", str.data());//data()函数回传字符串的指针,与c_str()相同 int len; char str1[50]; strcpy(str1, str.data());//赋值 len = strlen(str1); printf("字符串的长度为(%d)\n", len); //使用strlen函数获取长度 len = lengthOfStr_c(str1);//len = lengthOfStr(str1); printf("字符串的长度为[%d]\n", len); //用上面的函数获取含有中文字符的字符串的真正长度 string str2 = str;//也可以用string str2.assign(str),这是string的赋值函数,不过和=没区别 len = str2.length();//也可以用len = str2.size(); printf("字符串的长度为(%d)\n", len); //使用string类的长度获取函数length() len = lengthOfStr(str2); printf("字符串的长度为[%d]\n", len); //用上面的函数获取含有中文字符的字符串的真正长度 system("pause"); }
输出:
字符串为:abcdef 字符串的长度为(6) 字符串的长度为[6] 字符串的长度为(6) 字符串的长度为[6] 请按任意键继续. . .
验证账号格式。
boost::regex rg("^[a-zA-Z0-9_\u4e00-\u9fa5]+$"); boost::smatch sm; if(boost::regex_match( name, sm, rg )){ return true; } else{ return false; }
中文长度测试:
int main() { setlocale(LC_ALL,"zh_CN.UTF-8"); string string1("中文长度测试acdef"); wchar_t str[256]; int read = mbstowcs(NULL, string1.c_str(), string1.length()); std::cout << "strign1.length = " << read << "\n"; return 0; }