字符型数组
- C 语言中没有字符串这种数据类型,可以通过 char 的数组来替代;
- 字符串一定是一个 char 的数组,但 char 的数组未必是字符串;
- 数字 0(和字符'\0'等价)结尾的 char 数组就是一个字符串,但如果 char 数组没有以数字 0 结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的 char 的数组。
字符数组与字符串区别
c
#include <stdio.h>
int main(void)
{
// 字符型数组
char arr[5];
printf("%d\n", sizeof(arr)); // 5 一个
char chr = 'a'; // char 是单个字符
// 声明赋值
char arr1[5] = {'h', 'e', 'l', 'l', 'o'};
printf("%s\n", arr1); // 指定了 5 长度,打印时没有遇到 \0 会有乱码
// 字符串声明
char * arr2 = "hello";
char char1[] = "hello"; // 相当于 "hello\0"
// 字符串默认以 \0 结尾
printf("%zu\n", sizeof(char1)); // 6
// 等同于 char1 的声明,第 6 位没有初始化默认是 0,0 等同于 \0
char char2[6] = {'h', 'e', 'l', 'l', 'o'};
printf("%s\n", char2);
return 0;
}
scanf 输入字符串
c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char str[10];
// 输入 helloworld 报错,只能输入 9 位,需要预留一位 \0
// 输入 helloworl 正常
// 输入 hello world 输出 hello,遇到空格会算输入一次完成
scanf("%s", str);
// 输入任意长度只会取前 9 位
scanf("%9s", str);
printf("%s", str);
return 0;
}
字符串拼接
c
#include <stdio.h>
int main(void)
{
char ch1[] = "hello";
char ch2[] = "world";
char ch3[20];
int i = 0;
while (ch1[i] != '\0')
{
ch3[i] = ch1[i];
i++;
}
int j = 0;
while (ch2[j] != '\0')
{
ch3[i + j] = ch2[j];
j++;
}
ch3[i + j] = 0;
printf("%s\n", ch3);
return 0;
}
gets
通过gets
输入一个字符串,直到出现换行符或读到文件结尾为止,超出了字符限制大小会报错
gets(str)
允许输入的字符串含有空格scanf("%s",str)
不允许含有空格
c
#include <stdio.h>
int main(void)
{
char ch1[100];
// 可以接收空格
gets(ch1);
// 通过正则 [^\n] 只在接收到 \n 时才结束,也能支持空格输入
// scanf("%[^\n]", ch1);
printf("%s\n", ch1);
return 0;
}
注意
由于scanf()
和gets()
无法知道字符串大小,必须遇到换行符或读到文件结尾为止才接收输入,因此容易导致字符数组越界(缓冲区溢出)的情况。
fgets
输入的回车也做为字符串的一部分。通过scanf
和gets
输入一个字符串的时候,不包含结尾的“\n”,但通过fgets
结尾多了“\n”
- 输入少于限定长度时
\n
会作为输入 - 输入大于等于限定长度时没有
\n
c
#include <stdio.h>
int main(void)
{
char ch1[10];
/*
s:字符串
size:指定最大读取字符串的长度(size - 1)
stream:文件指针,如果读键盘输入的字符串,固定写为stdin
*/
fgets(ch1, sizeof(ch1), stdin);
printf("%s\n", ch1);
return 0;
}
puts
输出一个字符串
c
#include <stdio.h>
int main(void)
{
char ch1[] = "hello wo\0rld";
// 输出时自带\n,遇到\0停止
puts(ch1);
puts(""); // 相当于输出 \n
return 0;
}
fputs
c
#include <stdio.h>
int main(void)
{
char ch1[] = "hello wo\0rld";
fputs(ch1, stdout);
// 等同于
printf("%s\n", ch1);
return 0;
}
strlen
计算字符串\0
之前的字符串长度
c
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch1[20] = "hello world";
printf("数组大小:%d\n", sizeof(ch1));
printf("字符串长度:%d\n", strlen(ch1)); // 需要 #include <string.h>
// 手动计算
int len = 0;
while (ch1[len] != '\0') len++;
printf("字符串长度:%d\n", len);
return 0;
}