c,c++,go语言字符串的演进

cpp 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
    char str[] = {'a','b','c','\0','d','d','d'};
    printf("string:[%s], len:%d \n", str, strlen(str) );
   
    return 0;
}
复制代码
string:[abc], len:3 

c语言只有数组的概念,数组本身没有长度的概念,需要另外设置一个字段来保证数组长度。而字符串天生就有长度的要求,于是增加了一个字符串结束符,来判断该char数组是否字符串,以及判断长度,结束符之后的内容就被忽略了。字符串的拼接,截取等操作,通过<string.h>提供的接口来实现。

C++增加了类的支持,这样可以把长度作为类的成员变量而存在,.zise()反应了数组的真实长度。

cpp 复制代码
#include <iostream>
#include <string>
#include <cstring>

using namespace std;
 
int main ()
{
   string str1 = "runoob";
   string str2 = "google";
   string str3;
   int  len ;
 
   // 连接 str1 和 str2
   str3 = str1 +'\0'+ str2;
   cout << "str1 + str2 : "<<str3 <<" "<< str3.c_str() << endl;
 
   // 连接后,str3 的总长度
   len = str3.size();
   cout << "str3.size() :  " << len <<" " <<strlen(str3.c_str())<< endl;
 
   return 0;
}

str1 + str2 : runoobgoogle runoob

str3.size() : 13 6

C++中字符串会将\0当成一个正常字符处理(打印时会当成空格或者不占位置的字符输出)

c_str()接口会将c++的字符串转换成c语言的字符串,遵循c语言字符串处理规则。

golang中的字符串去掉了有争议的'\0'(代码中出现会编译错误),字符串可以表示为[]byte和string,存储上,这两者没多大区别。string中增加了截取,查找等常规操作,string中的字符无法直接修改,每次变动都会引起重新内存分配,方便,但效率较低。

面试官:你能聊聊string和[]byte的转换吗?-腾讯云开发者社区-腾讯云

各种语言的string发展史,可以看到语言从低级向高级发展,使用上越来越方便了。

string在windows上的表现更为复杂,主要在世界各种语言的兼容上,比如中文和一些winapi,尽量使用wchar版本,还有wchar_t, WCHAR,wstring... 我也不清楚在linux和golang上面,这个问题似乎消失了,有知道原因的烦请告知,网络上的一些答案太坑。

相关推荐
OOJO2 小时前
c++---list介绍
c语言·开发语言·数据结构·c++·算法·list
笨笨饿4 小时前
29_Z变换在工程中的实际意义
c语言·开发语言·人工智能·单片机·mcu·算法·机器人
艾为电子4 小时前
【技术帖】让接口不再短命:艾为 C-Shielding™ Type-C智能水汽防护技术解析
c语言·开发语言
会编程的土豆4 小时前
【数据结构与算法】动态规划
数据结构·c++·算法·leetcode·代理模式
Vfw3VsDKo5 小时前
Maui 实践:Go 接口以类型之名,给 runtime 传递方法参数
开发语言·后端·golang
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 78. 子集 | C++ 回溯算法题解
c++·算法·leetcode
所以遗憾是什么呢?6 小时前
【题解】Codeforces Round 1081 (Div. 2)
数据结构·c++·算法·acm·icpc·ccpc·xcpc
白藏y6 小时前
【C++】muduo接口补充
开发语言·c++·muduo
笨笨饿6 小时前
30_泰勒级数
c语言·stm32·嵌入式硬件·线性代数·机器学习·自动化·概率论
xiaoye-duck7 小时前
《算法题讲解指南:递归,搜索与回溯算法--综合练习》--14.找出所有子集的异或总和再求和,15.全排列Ⅱ,16.电话号码的字母组合,17.括号生成
c++·算法·深度优先·回溯