"n407as1"xabc"求字符串的长度(请老师讲得详细一点)

"n407as1"xabc"求字符串的长度(请老师讲得详细一点),第1张

字符串的内容是 \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不输出宽字符等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9461214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存