C语言 —— 字符串

字符串

一、定义

一个或多个字符的序列。
字符串实际上是使用空字符 ‘\0’ 结尾的一维字符数组。因此 ’\0’ 是用于标记字符串的结束。


“I am a simple!”

  • 使用 NULL字符'\0'终止的一维字符数组。
  • 双引号将字符串括起来,告知编译器它是字符串.

二、储存字符串

字符串被储存在char类型的数组中(由连续的储存单元组成)
字符串中字符储存在相邻储存单元,每个单元存储一个字符。
在这里插入图片描述
注意:

  1. 空格也是字符。
  2. ‘\0’是空字符,表示字符串的结束,属于非打印字符。(空字符不用亲自打印,程序自动添加)
  3. 数组容量 = 待存储字符串字符数+1(char name[5] = “Smith”; 错误
  4. ‘a’ 表示是一个字符,“a” 表示一个字符串相当于 ‘a’+‘\0’;
    ''里面只能放一个字符;
    ""里面表示是字符串系统自动会在串末尾补一个‘\0’

三、使用字符串

%s 转换说明 打印字符串


  1. 初始化

    char s[6] = {‘K’,‘i’,‘t’,‘t’,‘y’,’\0’};

    char s[6] = {“Kitty”};

    char s[ ] = {“Kitty”};

    char *s = “Kitty”;

    注意
    如果没有在字符数组最后增加\0的话输出结果有误

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
    	// 初始化字符串
    	char greeting[5] = { 'H', 'e', 'l', 'l', 'o' };
    	printf("Greeting message: %s\n", greeting);
    }
    

    在这里插入图片描述
    在使用不定长数组初始化字符串时默认结尾为\0

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
    	// 初始化字符串
    	char greeting[] = "Hello";
        printf("Greeting message: %s, greeting[] Length: %d\n", greeting, sizeof(greeting));
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LjWFBoFz-1644214772746)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/757e552f-c8d0-4f81-abca-90149adea805/Untitled.png)]

  2. 输出

    for 遍历:

    for(i=0, i<6, i++)
    {
        printf("%c",s[i]);
    }
    

    直接输出:

    printf(s);

    字符串格式(%s)输出:

    printf("%s",hi);

四、操作字符串的函数

  1. strcpy(s1, s2);

    复制字符串 s2 到字符串 s1。

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
    	char str1[6] = "Hello";
        char str3[6];
        strcpy(str3, str1);
        printf("%s\n", str3 );
    }
    

    在这里插入图片描述

  2. strcat(s1, s2);

    连接字符串 s2 到字符串 s1 的末尾。

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
    	char str1[6] = "Hello";
        char str2[] = " Kitty";
        strcat( str1, str2);
        printf("%s\n", str1 );
    }
    

    在这里插入图片描述

  3. strcmp(s1, s2);

    若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。

    两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
    	char str1[6] = "Hello";
        char str2[6] = "Kitty";
        int num = strcmp( str1, str2);  //逐个比较,H<K,输出-1
        printf("%d\n",num);
    
    		char str3[6] = "Hello";
        char str4[8] = "Hellcat";
        num = strcmp( str3, str4);  //逐个比较,直到比到不相同的地方o>k,输出1
        printf("%d",num);
    }
    

    在这里插入图片描述

  4. strchr(s1, char);

    返回一个指针,指向字符串 s1 中指定字符的第一次出现的位置。(末尾的空字符也是字符串的一部分,所以在查找范围内)。如果在字符串s中未找到c字符,该函数则返回空指针。

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        char str1[] = "beautiful";
        char *ptr = strchr(str1,'u');
        printf("%s",ptr);
    }
    

    在这里插入图片描述

  5. strstr(s1, s2);

    返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        char str1[] = "remember";
        char *ptr = strstr(str1,"em");
        printf("%s",ptr);
    }
    

    在这里插入图片描述

  6. strlen(s1);

    返回字符串 s1 的长度。

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        char str1[] = "remember";
        printf("%d",strlen(str1));
    }
    

    在这里插入图片描述
    注意
    strlen 与 sizeof 的区别

    strlen 是函数,sizeof 是运算操作符,二者得到的结果类型为 unsigned int 类型。

    sizeof 计算的是变量的大小,需要加上字符\0

    而 strlen 计算的是字符串的长度,不需要加上\0

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        char str1[] = "remember";
        printf("%d\n",strlen(str1));
        printf("%d",sizeof(str1));
    }
    

五、其他

  1. 输入超过字符数组大小的字符串

    定义了数组,编译器为这个数组在栈里开辟了3个字节的内存空间,但是这3个空间之后的一些空间是没有被占用的,你就成功得输入了超过了3个数到这个数组中,并且能正常输出,但是如果之后的空间被占用了,就会导致严重的问题,会提示该内存不可写。

    输入和输出函数只管把数组’\0’结尾前的字符序列以字符串形式输出,C/C++是不检查数组越界的。防止数组越界的任务完全由程序员事先安排完成;如果越界的空间被占用,后果则有程序员自己承担。

  2. 字符数组名与整型数组名
    在这里插入图片描述
    解释:对于一维字符数组名的输出,编译器会默认你想输出的是数组里的内容,而对于其他类型数组名的输出,如整形数组,编译器默认的输出是数组首元素的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值