字符串的内容是 \n\\\407as1\"\xabc 吗?
应该是 8 个。
从左到右的说:
\n 是一个。 注意转义符号。
\\ 是一个。 注意转义符号。
\407是一个。 注意转义符号后面是八进制数
a是一个。
s是一个。
1是一个。
\"是一个。 注意转义符号。
\xabc是一个。注意转义符号后面是十六进制数。
另外需要说明的是,这个字符串应该是个宽字符串,否则\407,\xabc存不下。
下面是验证程序:
#include <iostream>
#include <iomanip>
#include <tcharh>
using namespace std;
int main(int argc, char argv[])
{
wchar_t c[] = L"\n\\\407as1\"\xabc";
int a =
wcslen(c);
cout << a;
return 0;
}
C中 string 是char 数组。strlen()的参数是char数组的首地址,他计算方式是找到字符串结束符'/0'。
C++中,string是一个类,他自己具有成员函数length();不过他需要对象去调用,即,string str;//申明 对象str
int strlength(void);
下面这段c++代码,讲解了c++中string 的和c中string的不同
#include<iostream>
using namespace std;
int main()
{
string str="hello!";
const char p;
p=strdata();
cout<<strlen(p)<<endl;
return 0;
}
C语言中要输出宽字符,可以使用wprintf(),同时要设置本地化,以适应宽字符输出。示例如下,输出宽字符“中”字。
#include <stdioh>
#include <localeh>
int main()
{
setlocale(LC_ALL, "chs");
wchar_t wc = L'中';
wprintf(L"%c\n",wc);
return 0;
}
wchar_t 是双字节字符, char 是单字节字符。 一般来说wchar_t几乎总是可以取代char(除非这个地方就是需要一个8位的东西)。 当然 wchar_t要比char 多占用一倍的内存空间。 一般来说vc下编程多半是用 TCHAR 类型, 根据编译器选项自动define成 wchar_t或者char
size_t你就当它是个整数就行了
short int 是16位整数,long int是32位整数 , long long 是64位整数 。 当然根据c流传下来的规则, int可以不写(就是说 short 和 short int是一样的)
int的长度跟编译器有关系, 原则上说int应该是当前平台下处理最快的那种整数类型。 在vc下int是32位整数
版本 2
子程序 转换Unicode转Ansi, 文本型, 公开, 将Unicode码转换为Ansi码 (返回转换后的文本)
参数 Unicode, 字节集, , 欲转换的Unicode字节集
局部变量 局部_计数, 整数型
局部变量 局部_结果数据, 字节集
局部变量 局部_结果文本, 文本型
局部_计数 = 取字节集长度 (Unicode) ÷ 2 ' 字符数目两个
局部_计数 = _宽字符到双字节1 (936, 512, Unicode, 局部_计数, 0, 0, 0, 假) ' 取转换后的数目
局部_结果数据 = 取空白字节集 (局部_计数)
_宽字符到双字节 (936, 512, Unicode, -1, 局部_结果数据, 局部_计数, 0, 假)
局部_结果文本 = 取字节集数据 (局部_结果数据, #文本型, )
返回 (局部_结果文本)
子程序 转换Ansi转Unicode, 字节集, 公开, 将Ansi码转换为Unicode码 (返回转换后的字节集)
参数 Ansi, 文本型, , 欲转换的Ansi文本
局部变量 数据2, 字节集
局部变量 长度
如果真 (Ansi = “”)
返回 ({ 0, 0 })
如果真结束
长度 = MultiByteToWideChar (0, 0, Ansi, 取文本长度 (Ansi) + 1, 数据2, 0)
数据2 = 取空白字节集 (长度 × 2)
MultiByteToWideChar (0, 0, Ansi, 取文本长度 (Ansi) + 1, 数据2, 长度 × 2)
返回 (数据2)
DLL定义
版本 2
DLL命令 MultiByteToWideChar, 整数型, , "MultiByteToWideChar" 参数 CodePage, 整数型
参数 dwFlags, 整数型 参数 lpMultiByteStr, 文本型
参数 cchMultiByte, 整数型 参数 lpWideCharStr, 字节集
参数 cchWideChar, 整数型
DLL命令 _宽字符到双字节, , "kernel32dll", "WideCharToMultiByte" 参数 代码页, 整数型, , CodePage
参数 标志, 整数型, , dwFlags 参数 宽字符文本, 字节集, , lpWideCharStr
参数 宽字符文本长度, 整数型, , cchWideChar 参数 双字节文本, 字节集, , lpMultiByteStr
参数 双字节文本长度, 整数型, , cchMultiByte 参数 默认文本, 整数型, , lpDefaultChar
参数 使用默认文本, 逻辑型, , lpUsedDefaultChar
DLL命令 _宽字符到双字节1, 整数型, "kernel32dll", "WideCharToMultiByte" 参数 代码页, 整数型, , CodePage
参数 标志, 整数型, , dwFlags 参数 宽字符文本, 字节集, , lpWideCharStr
参数 宽字符文本长度, 整数型, , cchWideChar 参数 双字节文本, 整数型, , lpMultiByteStr
参数 双字节文本长度, 整数型, , cchMultiByte 参数 默认文本, 整数型, , lpDefaultChar
参数 使用默认文本, 逻辑型, , lpUsedDefaultChar
支持的
使用C++进行Unicode编程
对宽字符的支持其实是ANSI C标准的一部分,用以支持多字节表示一个字符。宽字符和Unicode并不完全等同,Unicode只是宽字符的一种编码方式。
1、宽字符的定义
在ANSI中,一个字符(char)的长度为一个字节(Byte)。使用Unicode时,一个字符占据一个字,C++在wcharh头文件中定义了最基本的宽字符类型wchar_t:
typedef unsigned short wchar_t;
从这里我们可以清楚地看到,所谓的宽字符就是无符号短整数。
2、常量宽字符串
对C++程序员而言,构造字符串常量是一项经常性的工作。那么,如何构造宽字符字符串常量呢?很简单,只要在字符串常量前加上一个大写的L就可以了,比如:
wchar_t str1=L" Hello";
这个L非常重要,只有带上它,编译器才知道你要将字符串存成一个字符一个字。还要注意,在L和字符串之间不能有空格。
3、宽字符串库函数
为了 *** 作宽字符串,C++专门定义了一套函数,比如求宽字符串长度的函数是
size_t __cdel wchlen(const wchar_t);
为什么要专门定义这些函数呢?最根本的原因是,ANSI下的字符串都是以’\0’来标识字符串尾的(Unicode字符串以“\0\0”结束),许多字符串函数的正确 *** 作均是以此为基础进行。而我们知道,在宽字符的情况下,一个字符在内存中要占据一个字的空间,这就会使 *** 作ANSI字符的字符串函数无法正确 *** 作。以”Hello”字符串为例,在宽字符下,它的五个字符是:
0x0048 0x0065 0x006c 0x006c 0x006f
在内存中,实际的排列是:
48 00 65 00 6c 00 6c 00 6f 00
于是,ANSI字符串函数,如strlen,在碰到第一个48后的00时,就会认为字符串到尾了,用strlen对宽字符串求长度的结果就永远会是1!
4、用宏实现对ANSI和Unicode通用的编程
可见,C++有一整套的数据类型和函数实现Unicode编程,也就是说,您完全可以使用C++实现Unicode编程。
如果我们想要我们的程序有两个版本:ANSI版本和Unicode版本。当然,编写两套代码分别实现ANSI版本和Unicode版本完全是行得通的。但是,针对ANSI字符和Unicode字符维护两套代码是非常麻烦的事情。为了减轻编程的负担,C++定义了一系列的宏,帮助您实现对ANSI和Unicode的通用编程。
C++宏实现ANSI和Unicode的通用编程的本质是根据”_UNICODE”(注意,有下划线)定义与否,这些宏展开为ANSI或Unicode字符(字符串)。
如下是tcharh头文件中部分代码摘抄:
#ifdef _UNICODE
typedef wchar_t TCHAR;
#define __T(x) L##x
#define _T(x) __T(x)
#else
#define __T(x) x
typedef char TCHAR;
#endif
/
计算字符串长度,将非宽字符计算为半个字符
@param str
@returns
/
function gbLength(str) {
return typeof str === "string" strlength + strreplace(/[\x00-\x7f]/g, '')length + 1 >> 1 : 0;
}
/
获取字符串的指定长度的子串,将非宽字符计算为半个字符
@param str
@param length
@returns
/
function gbSubstr(str, length) {
if (typeof str !== "string")
return str;
length += length;
for ( var n = 0, L = strlength; n < L && length > 0; n++){
length -= strcharCodeAt(n) > 127 2 : 1;
}
return strsubstr(0, n);
}
/
切割指定字符串的指定长度子串,如果长度超过指定长度,则丢弃末尾两个字符并附加
@param str
@param len
@returns
/
function fit_length(str, len){
len = len || 16;
if (typeof str !== "string" || strlength <= len || gbLength(str) <= len){
return str;
}
var ret = gbSubstr(str, len - 2);
return ret + '';
}
以上就是关于"\n\\\407as1\"\xabc"求字符串的长度(请老师讲得详细一点)全部的内容,包括:"\n\\\407as1\"\xabc"求字符串的长度(请老师讲得详细一点)、请问strlen能计算C++中字符串变量的长度吗还是只能计算C风格的字符串的长度谢谢!!、C语言printf不输出宽字符等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)