char */string /const char*之间的相互转换和计算字符串大小的size()/sizeof()/strlen()的应用

把string转换为char* 的三种方式:
1.data()函数
exp:
string str=“abc”;
char* p=str.data();
2.c_str()
exp:
string str=“gdfd”;
const char* p=str.c_str();
3.copy
exp:
string str=“hello”;
char p[40];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
(p+5)=‘\0’; //要手动加上结束符
cout <<p;
size()/sizeof()/strlen()/length()/应用总结:
1、sizeof() 可以以类型、指针、数组和函数等作为参数,其值在编译时计算,用于获取操作数所占空间的字节数大小。
2、strlen()函数其参数只能为char(字符型指针)*,所以在计算字符数组(char str[ ])时,一般用strlen()函数(也只能用于计算字符数组了)。此函数是c中的函数,使用必须include<string.h>, 不能是include,前者是c的函数,后者是c++的标准库函数
3、size()函数以及length()函数都用于计算字符串(string)长度,不能用char
作为参数。除此之外,size()函数还可以获取vector类型的长度。
举例子:
char ss[100] = “0123456789”;
sizeof(ss); 输出的是100,为分配的字节数;如果ss为int类型的数组,那sizeof(ss)则为1004=400个字节
stren(ss) ; 输出为10,它的内部实现用一个循环计算字符串的长度,直到’\0’为止。不包含’\0’;
char
ss = “0123456789”;
stren(ss);输出为10;
sizeof(ss);输出为4,是char性指针的大小;

string str={‘a’,‘b’,‘c’,‘\0’,‘X’};
那么sizeof(str)为5,strlen(str)为3。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个函数存在几个问题: 1. `DST` 数组的大小为 1024,但是在 `iconv` 函数中使用的 `DstLen` 参数是 `sizeof(Dst)`,这将导致 `DstLen` 的值始终为 1024,无法正确反映实际转换后的字符串长度。你应该使用 `strlen` 函数来获取实际的转换字符串的长度。 2. `Out1` 是一个静态指针,并且没有分配内存。在 `*Out1 = Dst;` 这行代码中,你试图将 `Dst` 数组的地址赋值给 `Out1` 指针,但是由于 `Out1` 没有分配内存,这将导致未定义的行为。你需要为 `Out1` 分配足够的内存来存储转换后的字符串。 3. 在函数结束前,你没有释放 `Cd` 对象。你应该使用 `iconv_close` 函数来关闭 `Cd` 对象以执行清理工作。 修正后的函数如下所示: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iconv.h> char* GBKToUTF8(char *Str) { char Dst[1024] = {0}; // 转换后的内容 size_t StrLen = strlen(Str); size_t DstLen = sizeof(Dst) - 1; // 留出一个字节用于存储字符串结束符'\0' char *In = Str; char *Out1 = (char*)malloc(DstLen + 1); // 分配足够的内存来存储转换后的字符串 char *ResultStr; iconv_t Cd; printf("%s\n", Str); printf("%d\n", StrLen); Cd = iconv_open("UTF-8", "GBK"); if ((iconv_t)-1 == Cd) { printf("iconv open error!\n"); } if (-1 == iconv(Cd, (const char**)&In, &StrLen, &Out1, &DstLen)) /* 执行转换 */ { printf("code convert error!\n"); } ResultStr = Out1; printf("%s\n", ResultStr); iconv_close(Cd); // 执行清理 return ResultStr; } ``` 这样修复后的函数将正确地进行转换,并返回转换后的字符串指针。记得在使用完 `ResultStr` 后,调用 `free(ResultStr)` 来释放动态分配的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值