C进阶养成记 - 养成记30:C语言中的字符串

--事物的难度远远低于对事物的恐惧!  

    这篇我们开始来谈谈C语言中的字符串,首先来看看字符串是个 什么东西:

        -字符串是有序字符的集合

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

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

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

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

    字符数组与字符串:

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

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

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

    有了以上的概念,来看看下边代码中哪些是字符串的定义,看看输出和你想的一样不

#include <stdio.h>

int main()
{
    char ca[] = {'H', 'e', 'l', 'l', 'o'};
    char sa[] = {'W', 'o', 'r', 'l', 'd', '\0'};
    char ss[] = "Hello world!";
    char* str = "Hello world!";
    
    printf("ca = %s\n", ca);
    printf("sa = %s\n", sa);
    printf("ss = %s\n", ss);
    printf("str = %s\n", str);
    
    return 0;
}

执行输出为


从输出结果看,第一个输出为乱码,另外三个输出为字符串,很容易理解,因为ca数组并没有以'\0'作为结尾,不满足字符串的概念,所以ca只是一个很普通的字符数组。

    下边来看看一个有趣的问题:“Hello”这个字符串字面量代表什么?

        -“Hello”是一个无名的字符数组

    看一段代码,想想执行结果会是什么?

#include <stdio.h>

int main()
{
    char b = "abc"[0];
    char c = *("123" + 1);
    char t = *"";
    
    printf("%c\n", b);
    printf("%c\n", c);
    printf("%d\n", t);
    
    printf("%s\n", "Hello");
    printf("%p\n", "World");
    
    return 0;
}

编译执行结果如下:


要理解上边的输出,我们首先来字符串字面量的一些特性:

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

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

    - 字符串字面量的字符不可改变

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

有了以上一点特性,我们就知道了,"Hello"这个字面量其实就可以看做一个常量指针,这个指针指向"Hello"这个字符串,所以"Hello"[1] ==  'e', *("Hello" + 1) = 'e';现在明白以上的输出了吗?

字符串的长度:

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

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

    -通过 '\0' 结束符来确定字符串的长度

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

下边以一个简单的示例来展示一下

#include <stdio.h>
#include <string.h>

int main()
{
    char s[] = "Hello\0world";
    int i = 0;
    
    for(i=0; i<sizeof(s)/sizeof(char); i++) 
    {
        printf("%c\n", s[i]);
    }
    
    printf("%s\n", s);

    printf( "%d\n", strlen(s) );
    printf( "%d\n", strlen("123") );
 
    
    return 0;
}

执行输出如下,这里需要注意的是sizeof与strlen的却别:



总结:

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

    - C语言中字符串使用 '\0' 作为结束符

    - 字符串字面量的本质为字符数组

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

    

猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/80155182