Skip to content
鼓励作者:欢迎打赏犒劳

c字符串

验证字符串\0

\0 是 C 语言字符串的“默认”且“强制”的结束标志

\0 是哪里来的? 它是编译器自动加上的,只要你使用双引号定义字符串。

情况 A:字符串字面量

c
char *p = "hello";

内存实际布局:
['h', 'e', 'l', 'l', 'o', '\0'] (共 6 字节)

情况 B:字符数组初始化

c
char str[] = "hello";

编译器同样会自动补上 \0
sizeof(str) 的结果是 6,而不是 5

情况 C:手动定义数组(危险!) 如果你手动一个个字符赋值,忘了加 \0:

c
char bad[5] = {'h', 'e', 'l', 'l', 'o'}; // 没有 \0!

这就不是一个合法的 C 语言字符串了。

代码测试

c
#include <stdio.h>
#include <string.h>

int main() {
   char str[] = "hi"; 
    // 内存里是:'h', 'i', '\0'

    printf("strlen: %d\n", strlen(str)); // 输出 2 (遇到 \0 就停,不算 \0)
    printf("sizeof: %d\n", sizeof(str)); // 输出 3 (计算总字节数,包含 \0)
}
  • 你看不到 \0,是因为它被定义为“空字符”,显示器不会为它绘制任何图形。
  • %s 遇到它会直接停止,更不会打印它。
  • 它确实存在,占用 1 个字节,值为 0,可以通过 %d 打印或 sizeof 计算来证实。

字符数组与字符串区别

  • C语言中没有字符串这种数据类型,可以通过char的数组来替代
  • 数字0(和字符 '\0' 等价)结尾的char数组就是一个字符串,字符串是一种特殊的char的数组
  • 如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组
c
#include <stdio.h>

int main() {
    char c1[] = {'c', ' ', 'p', 'r', 'o', 'g'}; // 普通字符数组
    printf("c1 = %s\n", c1);                    // 有可能乱码,因为没有'\0'结束符

    // 以'\0'('\0'就是数字0)结尾的字符数组是字符串
    char c2[] = {'c', ' ', 'p', 'r', 'o', 'g', '\0'};
    printf("c2 = %s\n", c2);

    // 字符串处理以'\0'(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出
    char c3[] = {'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0'};
    printf("c3 = %s\n", c3);

    // 使用字符串初始化,编译器自动在后面补0,常用
	char c4[] = "c prog";
    printf("c4 = %s\n", c4);

    return 0;
}

字符串的输入输出

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

c
#include <stdio.h>

int main()
{
    char str[100];

    printf("input string1: ");
    // scanf("%s",str) 默认以空格分隔
    // 可以输入空格
    gets(str);
    printf("output: %s\n", str);

    return 0;
}

字符指针

在c语言中 没有字符串这个类型 只有char数组类型,也就是字符串其实上就是一个char数组。

字符指针可直接赋值为字符串,保存的实际上是字符串的首地址

c
#include <stdio.h>

int main() {
    char *p = "hello";  // 和 const char *p = 'hello' 等价,有没有const都一样
    // 指针变量所指向的内存不能修改
    // *p = 'a';    // err
    printf("p = %s\n", p);

    // 指针变量可以修改
    p = "world";
    printf("p = %s\n", p);

    return 0;
}

字符串常用库函数

strlen

函数说明:

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

示例代码:

c
#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "abcdefg";
    int n = strlen(str);
    printf("n = %d\n", n);

    return 0;
}

运行结果

c
n = 7

strcpy

函数说明:

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

示例代码:

c
#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "123456789";
    char src[] = "hello world";
    strcpy(dest, src);
    printf("%s\n", dest);

    return 0;
}

运行结果

c
hello world

strcat

函数说明:

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

示例代码:

c
#include <stdio.h>
#include <string.h>

int main() {
    char str[20] = "123";
    char *src = "hello world";
    strcat(str, src);
    printf("%s\n", str);

    return 0;
}

运行结果

c
123hello world

strcmp

函数说明:

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

示例代码:

c
#include <stdio.h>
#include <string.h>

int main() {
    char *str1 = "hello world";
    char *str2 = "hello mike";

    if (strcmp(str1, str2) == 0) {
        printf("str1==str2\n");
    } else if (strcmp(str1, str2) > 0) {
        printf("str1>str2\n");
    } else {
        printf("str1<str2\n");
    }

    return 0;
}

运行结果

c
str1>str2

如有转载或 CV 的请标注本站原文地址