C语言中的字符串的处理是软件开发行业用的比较多的一个知识点,因此我们有必要了解一下字符串在C语言中长的是什么样子的。


字符串的概念:

  1. 字符串是有序字符的集合

  2. 字符串是程序中的基本元素之一

  3. C语言中没有字符串的概念

    --C语言中通过特殊的字符数组模拟字符串

    --C语言中的字符串是以'\0'结尾的字符数组


字符数组与字符串

  1.在C语言中,双引号引用的单个或多个字符是一种特殊的字面量

     --存储于程序的全局只读存储区

     --本质为字符数组,编译器自动在结尾加上'\0'字符

字符串字面量在程序的运行期间是不能被改变的,一旦改变将引起程序的崩溃。


  例如:下面哪些是字符串?

    char ca[] = { 'H', 'e', 'l', 'l', 'o' };  //为字符数组,不为字符串,因为结尾没有'\0'
    char sa[] = { 'W', 'O', 'r', 'l', 'd', '\0' };  //为字符串,结尾有'\0’
    char ss[] = "Hello World!";//为字符串,字符串字面量,在C语言中是个特例,可以用字符串来初始化一个字符数组,编译器会自动在结尾加上'\0’;
    char* str = "Hello World!";//为字符串,用字符指针指向一个字符数组,合法

  C语言中字符串的问题_C语言

程序运行后出现这样的原因是因为第11行中%s是要打印一个字符串,而ca是一个字符数组,所以程序运行会出现乱码。

这里我们要注意一点:就是所有与字符串相关的操作,所有与字符串相关的函数,都依赖于最后的‘\0’这个结束符,如果一个字符串没有‘\0’,那么它将退化为字符数组,字符数组是不能作为参数被字符串处理函数所处理的,否则出现错误。就如上面的那样。


--字符串字面量的本质是一个数组

--字符串字面量可以看做常量指针

--字符串字面量中的字符不可改变(存储于只读存储区)

--字符串字面量至少包含一个字符


"Hello World!”是一个无名的字符数组


下面的表达式输出结果:

C语言中字符串的问题_字符串_02

b里面的“abc”是一个无名的字符数组,“abc"[0]实际上打印的是第0个元素  所以为a;

c里面的 “123”也是一个无名的字符数组,“123”+1实际上是指针运算,指针向后移动一位,所以为2;

t里面的  ""实际上是一个空字符串,里面是“\0”,*“ ”表示将里面的\0以十进制的方式打印出来,查询ASC ‘\0’的十进制为0;

C语言中字符串的问题_C语言_03

%s是打印字符串,“Hello”为字符串 所以被打印出来了。%p是打印地址,00FF5870是打印在内存中“world”的地址。



字符串的长度

 1.字符串的长度就是字符串所包含字符的个数

 2.字符串长度指的是第一个'\0'字符前出现的字符的个数。

 3.通过‘\0’结束符来确定字符串的长度


函数strlen用于返回字符串的实际长度

C语言中字符串的问题_字符串_04


strlen()函数在处理字符串的时候遇到第一个\0就结束运算,打印出\0前面的字符的个数。当出现多个\0的时候,只以第一个作为结束符。



小结:

  1. C语言中通过字符数组模拟字符串;

   2.C语言中的字符串使用'\0’作为结束符;

   3.字符串字面量的本质为字符数组

   4.字符串相关的函数都依赖于结束符'\0'


strlen()和sizeof()的区别

  1. strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针。了。

  2. 它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL

字符串的详解:https://blog.csdn.net/smf0504/article/details/51673529


    3.sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。

       它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。

       由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。

       具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
    数组——编译时分配的数组空间大小;
    指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
    类型——该类型所占的空间大小;
    对象——对象的实际占用空间大小;
    函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。

   sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。


我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:

char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。



char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位

strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen