目录
- 如何存储字符串?
- 字符数组与字符串有何区别?
- 字符串操作函数
- 使用指针数组存放字符串
- 易混淆内容
<一> 如何存储字符串
C中字符串使用字符数组进行存储,未初始化的部分补 '\0',如果没有指定数组大小,字符串初始化时最后会额外存储 '\0' 。
char c1[10] = "hello!";
char c2[10] = {'h','e','l','l','o','!','\0'};
if(c1[9]=='\0'&&c1[9]==NULL&&c1[9]==0&&NULL=0){
puts(c1);
}
<二> 字符数组与字符串有何区别
字符串只是简化了初始化字符数组的方法,在上方程序中,c2初始化时及时最后不指定 '\0' ,编译器会将剩余未初始化的内容置0;
char c1[] = "hello!hello!";
char c2[] = {'h','e','l','l','o','!','h','e','l','l','o','!'};
printf("%i",sizeof(c1)); //13
printf("%i",sizeof(c2)); //12
<三> 字符串操作函数
1> 字符串转换为长整型long、long long (当前函数声明位于stdlib.h头文件中)
使用示例:
char s1[10] = "99886";
char *endptr;
long a = strtol(s1,&endptr,10);
printf("%i\n",a);
2> 字符串求长(当前函数声明位于string.h头文件中)
int len1 = strlen(s1);
int len2 = 0;
for(len2=0;s2[len2];len2++);
printf("%i %i\n",len1,len2);
3> 字符串复制(当前函数声明位于string.h头文件中)
strcpy(s1,s2); //将s1复制到s2
puts(s1);
puts(s2);
4> 字符串合并(当前函数声明位于string.h头文件中)
char *s3 = strcat(s1,s2); //将s2拼接在s1后方
puts(s3);
5> 字符串倒置(手动实现)
#include <stdio.h>
int main(){
char s1[10] = "hello!";
int i = 0;
for(;s1[i];i++);
for(int j=0;j<i/2;j++){
int temp = s1[j];
s1[j] = s1[i-j-1];
s1[i-j-1] = temp;
}
puts(s1);
return 0;
}
6> 字符串清空
memset(buffer,0,sizeof(buffer)); //string.h
7> 字符串分隔 strsep
注意:只能分隔单标记!但可以转换为整数求和(空格会被转换为0!)
#include <stdio.h>
#include <string.h>
int main(){
char s[] = "aaa bbbb cccc";
char *sp,*token;
sp = s;
printf("%p\n",s[4]);
while((token = strsep(&sp," "))!=NULL)
printf("%s ",token);
printf("%p***\n",token);
return 0;
}
详细使用说明:
- 为什么要传入二级指针? 为了在函数中修改函数外的字符串!
- token返回分割后的字符串首地址,地址与原字符串保持一次,长度为分割后字符串的长度;
- sp指向分割后的下一个字符串首地址;
- 注意:原字符串会被替换为第一个token!
8> 字符串比较 strcmp
成功返回0,失败返回-1;
<四> 使用指针数组存放字符串
#include <stdio.h>
void show(char *a[],int n){
for(int i=0;i<n;i++){
puts(a[i]);
}
}
void show2(char **a,int n){
for(int i=0;i<n;i++){
puts(a[i]);
}
}
int main(){
char *a[] = {"hello","world","love","you"};
char *b[] = {"hello","world","love","you"};
show(a,4);
show(b,4);
return 0;
}
程序解析:
指针数组即数组内部存放的是指针,而不是值;当作为函数参数时,有两种形式可以表示形参(见上述示例);
<五> 易混淆内容
int (*p)[5]:名为p的指针,指向列为5的二维数组
int *p[5]:指针数组(数组内部存放的是指针,常用于存放多个字符串)
int (*p)():名为p的指针,指向一个函数
int *p():函数名为p的函数,返回int型指针