最近在看C代码写的开源软件putty,因为C代码经验非常少,分析起来很吃力,觉得把C语言的一些特性在复习一下很有必要,这里利用中午的半个小时把C风格的字符串总结一下:
0.
所有人都知道的一点:
C风格字符串都是以'\0'结尾的。所以如果拷贝一个字符串,请确保计算的长度已经考虑了这个结尾符号。
另外C风格的字符串是在内存上申请数组存储的,所有的保护措施需要申请者自己维护,new过之后一定要delete。
1.
C风格字符串如:“Hello World!”,实际上是长度为n的const char 数组。当你赋值给一个非const 的 char* 时,编译器并不做限制。
因此这潜在的会导致一些风险:
char* pStr = “Hello World!”;
pStr [0] = "h";
第二句会导致程序崩溃,因为你试图给一个const char 数组的0下标元素赋值。
如何避免这个问题呢?
char arr[] = " Hello World! ";
arr[0] = 'h';
使用char arr[] 来初始化一个字符串数组,编译器会帮助你申请一个合适的内存并拷贝。这个数组正如声明一样,是非const的。
2.
时刻记住你当前处理的是字符数组指针还是一个数组?请看下面的区别:
char* pStr = “Hello World!”;
int n1= sizeof(pStr ); // n1 值: 4
int n2 = strlen(pStr ); // n2 值:12
char arr[] = " Hello World! ";
int n3= sizeof(arr); //n3值:13
int n4= strlen(arr); //n4值:12
3.
字符串内容的比较:
char* a = "12";
char b[] = "12";
if (strcmp(a, b) == 0)
{
//Todo:
}
不可以直接比较两个字符串变量:
if (a == b) //错误用法
{
//
}
直接使用比较运算符是C++风格字符串string的用法,也是使用C++风格字符串的优势。
(题外话:STL中的string并不是一个类,而是basic_string<char> 类的typedef。)
注:
目前只想到这三点,后续慢慢增加。