最后一个字符为'\0'的“字符数组”就是字符串,或者说“字符串”就是‘\0’结尾的特殊的字符数组

一、 ‘\0’、0、NULL、’0’区别

1. 相同点:这三个的值相同,都为 0

(1)

'\0':空字符,也被称为NULL字符,它是一个转义字符,其ascii值为0

char buf[10] = {};

等价于

char buf[10] = {'\0','\0','\0', ...};

因为0'\0'ascii值,所以全部初始化为0时,其实就是相当于全部初始化为了'\0'字符

(2)

0 就是一个int

(3)
NULL空指针,在C`中,NULL的宏体为(void *)0`


2. 不同点

虽然值都是0,但是各自的数据类型不同,我们说过,在强类型的C语言中,
类型不同就意味者解释方式不同,各自的用途也不同

1)'\0':用作字符串的结尾字符
2)0:一般算数运算用
3)NULL:空指针,用在指针操作中

当然如果非要进行强制转化的话,也可以混用。

char a = (char)0;        //等价于char a = '0'
char a = (char)NULL;     //等价于char a = '0' 
char *p = (void *)0;     //等价于char *p = NULL;
char *p = (void *)'\0';  //等价于char *p = NULL;

字符'0'ascii码值为48,与'\0'是两个完全不同的字符,'\0'ascii码值为0


二、字符串初始化

字符串初始化

char buf[]   = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0'};
char buf[12] = {"hello world"};
char buf[]   = "hello wolrd";

三、常见字符串操作函数

1. strlen 函数与 sizeof 运算符

  • strlen 是一个函数,而 sizeof 是一个运算符
  • strlen 函数,专门用于操作字符串的,测试字符串中字符的个数,不包含 '\0'
  • sizeof 用于测试空间的字节数,包含 '\0'

2. strcpy 与 strncpy

str:string
cpy:copy
函数将源空间中字符串,完整的复制到目标空间

注意:要求目标空间 >= 你要复制的字符的个数

#include <stdio.h>

int main(void)
{
    char buf1[]   = "hello world";
    char buf2[12] = "";

    strcpy(buf2, buf1); // buf1 复制到 buf2
    puts(buf2);

    return 0;
}

strncpy 多了第三个参数,表示复制多少个字符

strncpy(buf2, buf1, 5); //  复制buf1前面5个字符到buf2
puts(buf2); // 输出:hello

3. strcmp 与 strncmp

strcmp 判断两个字符串,是否完全相等,如果相等返回0,不相等返回 -1

#include <stdio.h>

int main(int argc, char **argv)
{

    char buf1[] = "hello world";
    char buf2[] = "hello world";

    if(strcmp(buf1, buf2) == 0)
    {
        puts("相等");
    }else{
        puts("不相等");
    }

    printf("%d", strcmp(buf1, buf2));

    return 0;
}

strncmp 判断两个字符串中,前面指定个数的字符是否相等

if(strncmp(buf1, buf2, 5) == 0)
{
    puts("相等");
}else{
    puts("不相等");
}

4. strcat 与 strncat

字符串连接

#include <stdio.h>

int main(int argc, char **argv)
{

    char buf1[20] = "hello world";
    char buf2[] = " good";

    strcat(buf1, buf2); // 把buf2的内容,追加到buf1

    puts(buf1); // 输出:hello world good

    return 0;
}

注意:buf1 的空间需要足够大,否则会导致数组越位

strncat(buf1, buf2, 3); // 把 buf2 前 3 个字符追加到 buf1 后面
puts(buf1); // hello world go

5. strchr 与 strrchr

原型:

char *strchr(const char *s, char c)
char *strrchr(const char *s, char c)

功能:

  1. 从第0个元素向后找字符c,找到后就终止寻找
  2. 反过来,从最后一个元素向前找字符c,找到后就终止寻找

返回:
找到后,返回被找到C所在字节的指针,否则返回NULL

举例:

char buf[] = "hello world, how are you!";

char *p = strchar(buf, 'r');
printf("%c\n", *p);

p = strrchar(buf, 'a');
printf("%c\n", *p);

6. strstr 与 strrstr

原型:

char *strstr(char *str1, const char *str2)
char *strrstr(char *str1, const char *str2)

功能:

  1. str1中顺序查找str2字符串,找到后就终止寻找
  2. str1中逆序查找str2字符串,找到后就终止寻找

返回:
找到后,返回被找到字符串的指针,否则返回NULL

举例

char buf[] = "hello world, how are you!";

char *str = strstr(buf, "orl");

printf("%s\n", str);

str = strrstr(buf, "re");
printf("%s\n", str);

注意:strstr 搜索的是“字符串”,strchr 搜索的是“字符”

7. strtod

原型:

double strtod(const char *str, char **endptr)

功能:
str中字符串形式的数字转为double数字,endptr用于存放被转换的最后一个字符指针+1

返回:
返回转换后的double数字

举例
(a)例子1

char str[30] = "20.30300";
double ret = 0.0;

ret = strtod(str, NULL); //第二个参数用不上,此时写NULL
printf("%f\n", ret);

(b)例子2

char str[30] = "20.30300 This is test";
char *ptr = NULL; // 放" This is test"第一个字符所在空间的指针
double ret;

ret = strtod(str, &ptr);
printf("%f\n", ret);  // 20.30300
printf("%s", ptr);    // This is test

8. atoi/atol

原型:

int atoi(const char *str)
long atoi(const char *str)

功能:

  1. str表示的数字转换int型的数字
  2. str表示的数字转换long型的数字

返回:
返回转换所得的int/long型数字

举例

printf("%d\n", atoi("102"));
printf("%ld\n", atol("102"));