对于C语言来说,字符串其实就是最后一个元素为’\0’的char数组
字符数组的初始化
字符数组常见的有两种初始化方式1
char str[] = "hello";
或者1
char str[] = {'h', 'e', 'l', 'l', 'o'};
当使用sizeof(str)时,得到的大小为6,此时是算上了’\0’的。
如果不指定数组长度的初始化,末尾加上’\0’,否贼输出长度未知1
2char str[] = {'a', 'b', 'c', '\0'};//这种初始化末尾需要加上'\0'
char str[] = "abc";//这种初始化不需要加上'\0'
字符串可以存放在堆区,栈区和常量区
缓冲区溢出
1 | char arr[3] = {0}; |
如果输入的字符大于字符数组的长度,会造成缓冲区溢出
scanf会以空格作为分隔符
字符串处理函数
gets
从输入设备获取输入字符串
gets不会检查预留缓冲区是否可容纳输入数据,没有解决缓冲区溢出问题
fgets
fgets用于读取文件,也可从键盘读取,此时要使用stdin。fgets会截取长度符合输入指定1
2char s[100] = { 0 };
fgets(s, sizeof(s), stdin);
puts
puts函数打印字符串,与printf不同,puts会在最后自动添加一个’\n’1
2char s[] = "hello"
puts(s);
fputs
fputs是puts的文件操作版本,也不会输出多余的’\n’1
2char s[] = "hello";
fputs(s, stdout);
strlen,字符串长度
strlen返回字符串长度,不包含’\0’1
strlen(arr);
strcat,字符串追加
1 | strcat(a,b); |
实现:1
2
3
4
5
6int len_a = strlen(a);
int len_b = strlen(b);
for ( int i = len_a; i < len_a + len_b; i++)
{
a[i] = b[i - lena];
}
strncat,字符串有限追加
1 | strncat(a, b, sizeof(a) - strlen(a) - 1); |
strcmp,字符串比较
如果相同返回01
strcmp(a, b);
strncmp,字符串有限比较
只要指定长度内相同,则返回01
strncmp(a, "str", 3);
strcpy字符串拷贝
把b拷贝到a1
strcpy(a, b);
strncpy字符串有限拷贝
防止拷贝越界
sprintf,格式化字符串
向char数组输出一个字符串,其他行为和printf一模一样1
sprintf(a, "this is a %d", 10);
strchr查找字符
返回一个位置的指针,如果没找到,返回NULL1
char *c = strchr(a, 'b');
strstr查找子串
1 | char *c = strstr(a, "abc"); |
strtok分割字符串
字符在第一次调用时strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL每次调用成功则返回指向被分割出片段的指针1
2
3
4
5
6
7char buf[] = "abc@defg@igk";
char *p = strtok(buf, "@");;
while (p)
{
printf("%s\n", p);
p = strtok(NULL, "@");
}
atoi转化为int
将字符串整数转化为整数1
atoi(buf);
atof转化为float
将字符串整数转化为单精度浮点数1
atof(buf);
atol转化为long
将字符串整数转化为long类型1
atol(buf);