目录
一、C 语言中的字符串
1.1 字符数组
在 C 语言中,字符串是通过字符数组来存储和处理的。字符数组是一种特殊的数组,它的每个元素都是一个字符。例如:
char str1[10] = "hello";
char str2[] = "world";
在上述代码中,str1是一个长度为 10 的字符数组,它存储了字符串 "hello",由于字符串常量以'\0'作为结束标志,所以虽然 "hello" 只有 5 个字符,但实际上在数组中占用了 6 个位置,最后一个位置存储'\0'。str2没有显式指定数组长度,编译器会根据初始化的字符串常量自动计算数组长度,这里str2的长度为 6。
1.2 字符串的输入输出
1.2.1 输入函数
- scanf函数:可以使用scanf函数读取字符串。例如:
char name[20];
scanf("%s", name);
这里需要注意的是,scanf函数在读取字符串时,遇到空格、制表符或换行符就会停止读取。
- gets函数:gets函数可以读取一行字符串,包括空格。例如:
char line[100];
gets(line);
然而,gets函数存在安全隐患,因为它不会检查输入的字符串是否超过数组的大小,可能导致缓冲区溢出,所以在较新的 C 标准中已被弃用。
- fgets函数:fgets函数是更安全的读取字符串的方式,它可以从指定的文件流中读取一行字符串。例如从标准输入流stdin读取:
char buffer[100];
fgets(buffer, sizeof(buffer), stdin);
fgets函数会读取最多sizeof(buffer) - 1个字符,然后加上'\0'结束标志。如果读取到换行符,也会将其包含在读取的字符串中。
1.2.2 输出函数
- printf函数:用于格式化输出字符串。例如:
char message[] = "Hello, world!";
printf("%s\n", message);
- puts函数:用于输出字符串并自动换行。例如:
char greeting[] = "Good morning";
puts(greeting);
1.3 常用字符串处理函数
C 语言的标准库<string.h>提供了许多实用的字符串处理函数。
1.3.1 字符串复制函数
- strcpy函数:用于将一个字符串复制到另一个字符数组中。例如:
char source[] = "example";
char destination[20];
strcpy(destination, source);
需要注意的是,目标数组destination必须足够大,以容纳源字符串及其结束标志'\0',否则会导致缓冲区溢出。
- strncpy函数:strncpy函数可以指定复制的字符数,更加安全。例如:
char src[] = "long string";
char dest[10];
strncpy(dest, src, sizeof(dest) - 1);
dest[sizeof(dest) - 1] = '\0';
这里复制最多sizeof(dest) - 1个字符,然后手动添加结束标志'\0',以防止目标数组越界。
1.3.2 字符串连接函数
- strcat函数:用于将一个字符串连接到另一个字符串的末尾。例如:
char str1[20] = "Hello, ";
char str2[] = "world!";
strcat(str1, str2);
同样,str1数组必须有足够的空间来容纳连接后的字符串。
- strncat函数:strncat函数可以指定连接的字符数,避免缓冲区溢出。例如:
char s1[30] = "First part";
char s2[] = " second part";
strncat(s1, s2, sizeof(s1) - strlen(s1) - 1);