字符串

1. 字符数组和字符串

  字符数组:由字符组成的数组,如char word[]={'H', 'e', 'l', 'l', 'o', '!'};

    • 这个数组由6个字符组成
    • 不是C语言的字符串,不能用字符串的方式做计算

  字符串:由字符组成的数组,但是数组最后一个元素是 或 '\0',如char word[]={'H', 'e', 'l', 'l', 'o', '!', '\0'};

    • 这个数组由7个字符组成,但是字符串长度为6
    • 0 是整数0,4个字节;'\0'是一个字符,1个字节;'0'是ASCII码48
    • 不能用运算符+-*/等对字符串做运算
    • 可以通过数组的方式对字符串做遍历,C的标准库提供了一系列函数来处理字符串
    • 可以用字符串字面量来初始化字符数组

     

   字符串变量:字符串都是字符数组,3种不同的写法:

    • char *str = "Hello";  //表示指针str指向的字符数组里面放的内容是"Hello",即{'H', 'e', 'l', 'l', 'o', '\0'}
    • char word[] = "Hello";  //表示字符数组word里面放的内容是"Hello",即{'H', 'e', 'l', 'l', 'o', '\0'}
    • char line[10] = "Hello";  //表示长度为10的字符数组line里面放了6个字符,即{'H', 'e', 'l', 'l', 'o', '\0'},虽然最多能放10个字符,但是只放了6个。但是数组line的长度依旧是10。

  字符串常量:即字符串字面量,如"Hello"

    • "Hello" 会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾是表示结束的0
    • 两个相邻的字符串常量会被编译器自动连接成一个字符串

2. 字符串变量的定义方式   

  char* s = "Hello, world! ";  //对于这句话,有以下说明:

    • s 是一个指针,初始化为指向一个字符串常量"Hello, world! "
      • 这个字符串常量所在的地方和本地变量不是一处,所以实际上char* s const char* s,这就是《指针》这一节所讲的“所指是const”,即不能通过指针去修改所指的变量的值,相当于只读不写,相当于保护了所指的字符串常量;即s[0] = "B"是会报错的。
      • 由于历史原因,编译器接受不带const的写法
    • 如果又定义了一个指针char*  = "Hello, world! "; 则指针 s 和 p 指向了同一个地方

  char s[]"Hello, world! ";  //对于这句话,这个字符串s是可以修改的。

    • 字符串s作为本地变量,其空间会被自动回收

  以上两种,选哪种方式来定义字符串呢?

    

   另外,char* 不是一个字符串,是一个指向字符的指针

    

 

3. 字符串的输入输出

  char str[8];  //定义一个8个元素的字符数组,作为字符串的话最多能放7个字符和最后一个结束标志'\0'

  scanf("%s", str);  //输入字符作为字符串,遇到输入时空格、tab或回车时停止读入

    • 这种写法有个问题就是数组越界,str可以容纳8个字符,所以输入字符数小于等于7都没问题,但是个数大于等于8之后就会越界报错

  printf("%s\n", str);  //输出字符串

  scanf("%7s", str);  //最多接收7个字符作为字符串,遇到输入时空格、tab或回车达到7个字符时自动停止接收,除非后面还有scanf,则由后面的scanf接收。

  几个常见错误:

  1. char *string;  //这只是定义了一个指向字符的指针,此时用scanf("%s", string); 就是错误的

  2. 空字符串:char str[100] = "";  这是一个空字符串,str[0] == '\0',数组str的长度是100

  3. 空字符串:char str[] = "";  这是一个空字符串,str[0] == '\0',数组str的长度是1

 

4. 字符串数组

  char a[][10]={“aaa”, "bb"};  //表示定义了一个数组a,a的每一个元素是一个长度为10的字符串数组。

  char *a[]={“aaa”, "bb"};  //表示定义了一个数组a,a的每一个元素是一个指向字符串的指针。

5. 字符串函数

  头文件string.h 给了很多字符串函数:strlen、strcmp、strcpy、stract、strchr、strstr

  5.1 int putchar(int c);    int getchar(void);

  听不太明白,视频链接:https://www.bilibili.com/video/BV1XZ4y1S7e1?p=91&vd_source=716f4a1d817b2308c0f0e492c8d315d8

  csdn这个这个更明白:一次搞懂getchar()_getchar()_MrWang.的博客-CSDN博客

  5.1.1 getchar()原型:

  所以char ch; ch = getchar();  实际上是对getchar()返回的ASCII码的一个类型转换,int转换成char类型。

 

  

 

  

   5.1.2 putchar()

  接收一个int类型数据,如果调用时传的实际参数是字符char类型,则char类型被转换成int类型,即该字符的ASCII码,取一个字节即8位,作为要打印

的字符。返回输出字符的ASCII码。

  

 

  5.2 字符串长度 strlen

  size_t strlen(const char *s);  //数组通过指针传入,当然数组的名字就是一个指针 。返回s所指向的字符串的长度(数组长度-1)

  5.3 两个字符串比较 strcmp

  

   5.4 字符串复制 strcpy

 

  

   复制之前先申请一个内存空间,用malloc函数:

    

   5.5 字符串搜索

 

  讲得不错,可以再看看https://www.bilibili.com/video/BV1XZ4y1S7e1?p=95&spm_id_from=pageDriver&vd_source=716f4a1d817b2308c0f0e492c8d315d8

  字符串中找字符:返回第一次出现的位置的指针,strrchr()是从右边开始找

    

   字符串中找字符串:

    

 

一次搞懂getchar()_getchar()_MrWang.的博客-CSDN博客
posted @ 2023-08-10 23:34  园友3218619  阅读(19)  评论(1)    收藏  举报