字符数组与字符串区别

  • C语言中没有字符串这种数据类型,可以通过char的数组来替代
  • 数字0(和字符 ‘\0’ 等价)结尾的char数组就是一个字符串,字符串是一种特殊的char的数组

image.png

  • 如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组
  1. #include <stdio.h>
  2. int main() {
  3. char c1[] = {'c', ' ', 'p', 'r', 'o', 'g'}; // 普通字符数组
  4. printf("c1 = %s\n", c1); // 有可能乱码,因为没有'\0'结束符
  5. // 以'\0'('\0'就是数字0)结尾的字符数组是字符串
  6. char c2[] = {'c', ' ', 'p', 'r', 'o', 'g', '\0'};
  7. printf("c2 = %s\n", c2);
  8. // 字符串处理以'\0'(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出
  9. char c3[] = {'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0'};
  10. printf("c3 = %s\n", c3);
  11. // 使用字符串初始化,编译器自动在后面补0,常用
  12. char c4[] = "c prog";
  13. printf("c4 = %s\n", c4);
  14. return 0;
  15. }

字符串的输入输出

  • 由于字符串采用了’\0’标志,字符串的输入输出将变得简单方便 ```c

    include

int main() { char str[100];

  1. printf("input string1: ");
  2. // scanf("%s",str) 默认以空格分隔
  3. // 可以输入空格
  4. gets(str);
  5. printf("output: %s\n", str);
  6. return 0;

}

  1. <a name="EzegD"></a>
  2. # 字符指针
  3. - 字符指针可直接赋值为字符串,保存的实际上是字符串的首地址
  4. - 这时候,字符串指针所指向的内存不能修改,指针变量本身可以修改
  5. ```c
  6. #include <stdio.h>
  7. int main() {
  8. char *p = "hello"; // 和 const char *p = 'hello' 等价,有没有const都一样
  9. // 指针变量所指向的内存不能修改
  10. // *p = 'a'; // err
  11. printf("p = %s\n", p);
  12. // 指针变量可以修改
  13. p = "world";
  14. printf("p = %s\n", p);
  15. return 0;
  16. }

字符串常用库函数

strlen

函数说明:

  1. #include <string.h>
  2. size_t strlen(const char *s);
  3. 功能:计算指定指定字符串s的长度,不包含字符串结束符‘\0
  4. 参数:
  5. s:字符串首地址
  6. 返回值:字符串s的长度,size_tunsigned int类型,不同平台会不一样

示例代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4. char str[] = "abcdefg";
  5. int n = strlen(str);
  6. printf("n = %d\n", n);
  7. return 0;
  8. }

运行结果:

  1. n = 7

strcpy

函数说明:

  1. #include <string.h>
  2. char *strcpy(char *dest, const char *src);
  3. 功能:把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去
  4. 参数:
  5. dest:目的字符串首地址,如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况
  6. src:源字符首地址
  7. 返回值:
  8. 成功:返回dest字符串的首地址
  9. 失败:NULL

示例代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4. char dest[20] = "123456789";
  5. char src[] = "hello world";
  6. strcpy(dest, src);
  7. printf("%s\n", dest);
  8. return 0;
  9. }

运行结果:

  1. hello world

strcat

函数说明:

  1. #include <string.h>
  2. char *strcat(char *dest, const char *src);
  3. 功能:将src字符串连接到dest的尾部,‘\0’也会追加过去
  4. 参数:
  5. dest:目的字符串首地址
  6. src:源字符首地址
  7. 返回值:
  8. 成功:返回dest字符串的首地址
  9. 失败:NULL

示例代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4. char str[20] = "123";
  5. char *src = "hello world";
  6. strcat(str, src);
  7. printf("%s\n", str);
  8. return 0;
  9. }

运行结果:

  1. 123hello world

strcmp

函数说明:

  1. #include <string.h>
  2. int strcmp(const char *s1, const char *s2);
  3. 功能:比较 s1 s2 的大小,比较的是字符ASCII码大小。
  4. 参数:
  5. s1:字符串1首地址
  6. s2:字符串2首地址
  7. 返回值:
  8. 相等:0
  9. 大于:>0
  10. 小于:<0

示例代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4. char *str1 = "hello world";
  5. char *str2 = "hello mike";
  6. if (strcmp(str1, str2) == 0) {
  7. printf("str1==str2\n");
  8. } else if (strcmp(str1, str2) > 0) {
  9. printf("str1>str2\n");
  10. } else {
  11. printf("str1<str2\n");
  12. }
  13. return 0;
  14. }

运行结果:

  1. str1>str2

字符串案例

  • 需求:自定义一个函数my_strlen(),实现的功能和strlen一样
  • 示例代码: ```c

    include

// 函数定义 int my_strlen(char * temp) { // 定义一个累加个数的变量,初始值为0 int i = 0; // 循环遍历每一个字符,如果是’\0’跳出循环 while (temp[i] != ‘\0’) { // 下标累加 i++; }

  1. return i;

}

int main() { char *p = “hello”; // 函数调用 int n = my_strlen(p); printf(“n = %d\n”, n);

  1. return 0;

} ```