字符串_C语言快速入门与计算机二级备考

字符数组与字符串

字符数组

  • 顾名思义,以数组的形式,数组的每一个成员存放一个char类型的字符,构成字符串

    例如:char word[]={'H','e','l','l','o','!'};

    这意味着word[0]=H,word[1]=e……

  • 可以像普通数组一样使用其中元素进行运算

字符串

  • 同上例:char word[]={'H','e','l','l','o','!','\0'};

    现在这个字符数组有七个单元(多出一个\0),这个0使得word[]从字符数组变成字符串

  • 字符串:以0(整数0,\0与0等价,但与字符'0'不同)结尾的一串字符

    0是字符串结束的标志,如果没有这个0,在读取字符串时程序会不知何时停止

    但它不是字符串一部分,在使用strlen()判断字符串长度时不包含这个0

    特别注意:在内存中,0也占一个单元,在定义数组长度时应该是字符数+1

字符串的定义

  • 为了方便,直接用双引号定义字符串,程序将自动生成为字符数组,

    char *str="Hello"; char word[6]="Hello";

    (这是字符串的两种表现形式,第一个为字符串常量,第二个是字符串变量)

    双引号中的内容"Hello" 会被编译器编译成一个字符数组

    如上所述,这个数组长度为6,包括5个char类型的字符与结尾一个表示结束的0

  • 内存中相邻的字符串会自动连接

字符串常量
  • char *s="Hello,world!"; s是一个指针,初始化为指向一个字符串常量
  • 字符串储存在只读的代码段,尝试对其修改是无效的
  • 指针:意味着这个字符串不知道在哪里,指针形式的字符串用于在处理函数参数与动态分配空间时处理一个字符串
  • 注意:char *s;定义的是字符指针而非字符串类型,不能将其*s="Hello"
  • 倘若不对其进行初始化为0,有可能这个指针指向错误的地方导致崩溃
字符串变量
  • 如果需要修改字符串,应该使用数组

  • char s[]="Hello,world!";

  • 数组:意味着这个字符串在这里,将作为本地变量,空间自动被回收;数组形式的字符串用于构造一个字符串(因为只有在数组形式下才能对字符串进行操作、运算)

  • char s[100]="";这样写出的是空字符串,s[0]=='0'

    char s[]="";这个数组的长度为1

字符串的处理

字符串赋值
  • 字符串赋值并不产生新的字符串,只是让指针s指向了指针t所指的字符串,对s的操作就是对t的操作

    例如:

    char *t="hello";
    char *s;
    s=t;
    
字符串输入输出
  • 输入scanf("%s",string);以及输出printf("%s",string);

    使用scanf读入的是一个单词(到空格、tab、回车为止)

    • 但是这种用法并不安全,读入内容的长度超出定义的字符串数组大小会崩溃

      有一种方法规避这种危险,例如:

      char word[8];//此时,这个字符数组只能容纳7个字符
      scanf("%7s",&word);//这样,就只会读入7个字符,避免了越界
      //因为字符串最后一位用于\0,所以允许读入的字符应该比数组小1
      //如果输入时超出了规定范围且有多个scanf,超出的内容将会交给下一个scanf阅读
      
  • 小技巧:输出当前函数的名称:printf("%s",__func__);

  • sprintf(字符串,“内容”,输出长度) 将内容输出到一个字符数组中去

单字符的输入输出

  • 使用getchar()函数来从标准输入读入一个字符

    char a;
    a=getchar();//从键盘输入一个字符,送给字符变量a
    
  • 输出单个字符时可以使用putchar()

    putchar('A');//输出字符A
    putchar(ch);//将字符变量ch所代表的字符输出
    
  • 可以利用循环来对输入的多个字符进行读入,例如:

    int ch;
    while ((ch = getchar()) != '-')
    {
    	putchar(ch);
    }
    //当读入的字符不是-时,将其原封不动地输出,然后判断下一个字符
    
  • getcharputchar的返回类型是int,char类型被放入其中

    这样是为了返回-1(即EOF,文件结尾)

字符串数组

  • 用一个数组表示多个字符串(不要和字符数组混淆),数组中的每个成员都是一个字符串
字符串数组的不同形式
  • char **a;这代表一个指针a,指向另一个指针,而那个指针指向一个字符串

  • char a[][10]={……};这代表一个字符串数组,a[0]相当于一个长度为10的字符串

    二维数组的性质要求必须给出列数,所以字符串长度固定,不能像数组一样

  • char *a[]={……};这种写法则不限制字符串长度,因为a[0]意味着char*,而这个指针指向了一个字符串

对字符数组的操作

  • 头文件#include <string.h> 包含很多用以处理字符串的函数
  • 下列使用时字符串的指针所指是const,这是为了避免原先的字符串在使用这些函数后遭到修改
判断字符串长度
  • strlen()

    与直接用sizeof判断数据大小相比,不同之处在于sizeof会将字符串结尾的\0也计入,而strlen只会计算字符数量

比较字符串的内容
  • srtcmp(const char *s1, const char *s2)

    数组之间无法比较,所以比较字符串需要借助这个函数

  • 返回的类型为size_t (一个用于表示数据大小的数):

    当返回值为0, s1==s2;返回值为1, s1>s2;返回值为-1, s1<s2

    事实上,这个函数会输出两个字符串中不同的那一位的ASCII差值,例如:字符串abc与Abc输出的将是32(a=97;A=65;字符串1比字符串2所相差的那位的ASCII值大了32)

复制字符串的内容
  • strcpy(字符数组1,字符串2)

    将字符串2复制到字符数组1的空间中(这要求1有足够空间容纳以2的内容)

    一般的等号运算并不能复制一个字符串的内容,而只是复制了指向同一字符串的指针

  • 常见用法:

    char* strcpy(char *restrict dst, const char *restrict src);

    作用是将src字符串拷贝到dst所表达的空间中,函数再返回dst

    restrict是C99新加入的前缀,表明src和dst不重叠,不能将一个字符串复制到有重叠的字符串中

    char *dst=(char*)malloc(strlen(src)+1);
    //为了确定src长度,使用动态的内存分配malloc,
    //为dst划分一块类型转换为char,大小为src字符数+1(为\0留位置)的内存
    strcpy(dst,src);
    //再将src复制到dst
    printf("%s",dst);
    free(dst);//使用完成后记得释放内存
    
搜索指定的字符
  • strchr(const char *s, int c);

    在字符串s中从左向右寻找字符c第一次出现位置

    strrchr(const char *s, int c);自右向左地寻找c

    返回null则表示没有找到,找到则返回指向要找字符的指针

    char s[]="hello";
    char *p=strchr(s,'l');//让p指向字符串s中第一个‘l’所在处
    printf("%s",p);//结果是llo:将p指向的地方开始作为字符串输出
    
    //怎样找字符串中的第二个l?
    p=strchr(p+1,'l');
    //做法就是已经指向第一个l的指针+1到下一位,继续寻找
    
    //而又怎样做到将l之前的字符复制下来?
    char c=*p;//p指向hello中的第一个l,使得c也指向那个l
    *p='\0';//将hello中的第一个l改为了\0,因此原本s所指的字符串只有he了
    char *t=(char*)malloc(strlen(s)+1);//准备一个能容纳he的t
    strcpy(t,s);//将s所指的he复制到t
    *p=c;//在使用完后利用原本保留的c再将l恢复回s中
    printf("%s",t);
    free(t)
    
搜索指定的字符串
  • strstr(const char *s1, const char *s2);

    在字符串s1中找字符串s2

    strcasestr(const char *s1, const char *s2);在寻找过程中忽略大小写

    应用类似strchr

连接两个字符串
  • strcat(s1,s2)

    将字符串s2的内容复制后拼接到字符串s1后,即连接两个字符串

  • 需要注意,拼接后字符串s1显然超出了原来分配的数组长度

    要使用realloc重新给s1分配足够的空间来存储新的字符串。

posted on   无术师  阅读(4)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示