在C语言中,字符串是由字符数组构成的序列,以空字符('\0'
)结尾。这个空字符不可见,用于标记字符串的结束。C语言中没有专门的字符串类型,通常使用字符数组表示字符串。
字符串可以通过几种方式在C语言中声明和初始化。
char str1[] = "Hello"; // 自动添加'\0'
char str2[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式添加'\0'
const char* str3 = "Hello"; // 指向字符串字面值
注意:使用指针指向字符串时,该字符串通常存储在程序的只读数据段中,不应被修改。
C语言标准库 <string.h>
提供了多种操作字符串的函数。
strlen()
#include <string.h>
size_t len = strlen(str1); // 计算字符串长度,不包含'\0'
strcpy()
和 strncpy()
char str4[10];
strcpy(str4, str1); // 复制字符串
strncpy(str4, str1, sizeof(str4)); // 复制指定长度的字符串
strcat()
和 strncat()
char str5[20] = "Hello, ";
strcat(str5, "World!"); // 在str5的末尾追加另一个字符串
strncat(str5, "Welcome!", 3); // 连接部分字符串
strcmp()
和 strncmp()
int cmp = strcmp(str1, "Hello"); // 比较两个字符串
int ncmp = strncmp(str1, "Hel", 3); // 比较两个字符串的前n个字符
strchr()
和 strstr()
char* pch = strchr(str1, 'e'); // 查找字符在字符串中的首次出现
char* pstr = strstr(str1, "lo"); // 查找子字符串在字符串中的首次出现
strcpy
和 strcat
等函数时,要确保目标数组足够大,以避免溢出。strncpy
和 strncat
作为更安全的替代。#include <stdio.h>
#include <string.h>
int main() {
char greeting[20] = "Hello, ";
const char* name = "C Programmer";
strcat(greeting, name); // 连接字符串
printf("Greeting: %s\n", greeting); // 输出结果
printf("Length: %lu\n", strlen(greeting)); // 输出字符串长度
return 0;
}
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最基本的字符编码标准,用于文字和控制字符的编码。它最初是基于英语字母的编码标准,但后来逐渐成为国际标准。
ASCII字符集包括以下几个部分:
控制字符:这些字符没有对应的可打印字符,用于控制像打印机等设备的行为。例如,换行(\n
)、回车(\r
)、制表符(\t
)等。
可打印字符:包括英文字母(大写和小写)、数字(0-9)、标点符号以及其他一些特殊符号。
ASCII定义了128个字符的编码,从0到127。每个字符占用一个字节(但实际上只使用了字节的低7位)。它可以分为以下两个主要部分:
ASCII编码广泛应用于计算机和通信设备中。例如,键盘上每个按键的敲击都对应一个ASCII码。计算机内部,文本文件通常都是以ASCII码的形式存储字符。
下面是一些常见ASCII字符及其对应的十进制、十六进制和二进制编码:
字符 | 十进制 | 十六进制 | 二进制 |
---|---|---|---|
A | 65 | 41 | 0100 0001 |
B | 66 | 42 | 0100 0010 |
a | 97 | 61 | 0110 0001 |
0 | 48 | 30 | 0011 0000 |
$ | 36 | 24 | 0010 0100 |
\n | 10 | 0A | 0000 1010 |
在C语言和其他许多编程语言中,字符常量实际上是它们对应的ASCII码。例如,'A'
实际上是整数65。
转义字符就是基于ASCII码设计出来的,用于表示无法直接显示的字符或具有特殊含义的字符。它们以反斜杠\
开头,后跟一个或多个字符,组合起来表示一个特定的字符。
以下是C语言中常用的转义字符及其意义:
转义字符 | 含义 |
---|---|
\n | 换行符 |
\t | 水平制表符 |
\b | 退格符 |
\r | 回车符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
\a | 警告(响铃) |
\f | 换页符 |
\v | 垂直制表符 |
\0 | 空字符(NULL) |
\ddd | 八进制表示的字符 |
\xhh | 十六进制表示的字符 |
\n
) 和 制表 (\t
):printf("Hello,\nWorld!\t2021\n");
输出:
Hello,
World! 2021
\'
) 和 双引号 (\"
):printf("It\'s a \"wonderful\" day.\n");
输出:
It's a "wonderful" day.
\\
):printf("C:\\Program Files\\MyApp\n");
输出:
C:\Program Files\MyApp
八进制和十六进制字符:
\ddd
表示一个八进制值对应的字符,ddd
是一到三个数字(0-7)。\xhh
表示一个十六进制值对应的字符,hh
是一个或两个十六进制数字(0-9, A-F)。示例:
printf("%c\n", '\101'); // 八进制表示的 'A'
printf("%c\n", '\x42'); // 十六进制表示的 'B'
输出:
A
B
\a
): 当打印此字符时,系统可能会发出响铃声(取决于系统配置)。printf("\a");
\0
(空字符)用于表示C字符串的结束。