字符串基础
字符串是以ASCII字符NUL结尾的字符序列,ASCII字符NUL表示为\0。字符串的长度是字符串中除了NUL字符之外的字符数。
- 字符串初始化
初始化char数组
//字符串初始化
//初始化操作会把字符复制到数组里面,以\0结尾。
char header[]=“Media Player";
//利用strcpy初始化
char header[13];
strcpy(header,“Media Player");
//把字符逐个赋给数组元素
header[0]='M';
...........
//下面的赋值是不合法的,不能把字符串字面量的地址赋给数组名字。
char header2[];
header2=“Media Player"; //不合法的
初始化char指针
char*header=(char*)malloc(strlen(“Media Player")+1);
strcpy(header,“Media Player");
//将字符串字面量的地址直接赋值给字符地址。
//这样做就不会产生字符串的副本了(对比上例)
char*header=“Media Player";
注意
char* p='+'; //不合法
//'+'是字符字面量,为int类型,这里是尝试把整数赋给字符指针
从标准输入初始化字符串
char*command;
scanf("%s",command);
/*当字符串长度少时可能没问题,
但是长了有可能会碰到其它内存,
造成错误,所以最好在声明就初始化或者分配空间。*/
字符串位置小结
char* globalHeader="Chapter";
char globalArrayHeader[]="Chapter";
void displayHeader()
{
static char*staticHeader="Chapter";
char*localHeader="Chapter";
static char staticArrayHeader[]="Chapter";
char localHeader[]="Chapter";
char* heapHeader=(char*)malloc(strlen("Chapter")+1);
strcpy(heapHeader,"Chapter");
}
- 标准字符串操作
1、比较字符串
int strcmp(const char *s1,const char *s2);
//s1<s2,负数
//s1==s2,相等
//s1>s2,正数
/***几种常见的错误表示***/
char command[16];
scanf("%s",command);
if(command="haha")
//首先不是比较,再者不可以把字符串面量的地址赋给数组名字。
char command[16];
scanf("%s",command);
if(command=="haha")
//比较的是command的地址和字符串字面量的地址。
2、复制字符串
char* strcpy(char *s1,const char *s2);
3、拼接字符串
char *strcat(char *s1,const char *s2);
//第一个字符串一定要分配的足够长。
①设置一个拼接区
char* error="ERROR:";
char*errorMessage="Not enough memory";
char*buffer=(char*)malloc(strlen(error)+strlen(errorMessage)+1);
strcpy(buffer,error);
strcat(buffer,errorMessage);
printf("%s\n",buffer);
printf("%s\n",error);
printf("%s\n",errorMessage);
②没有缓存区,造成的偏移
char* error="ERROR:";
char*errorMessage="Not enough memory";
strcat(error,errorMessage);
printf("%s\n",error);
printf("%s\n",errorMessage); //会出错
/**
显示:
ERROR:Not enough memory
ot enough memory
③、不正确的字符串拼接操作
char error[]="ERROR:";
char errorMessage[]="Not enough memory";
//错,函数的名字不能变化
error=strcat(error,errorMessage);
/**复制操作会覆写栈帧的一部分,
无论源字符串是存储在字符串字面量池中还是栈帧中,
都不应该用来直接存放拼接后的结果,
一定要专门为拼接结果分配内存:**/
strcat(error,errorMessage);
- 传递字符串
以下两种方法都是OK的
size_t stringLength(char string[]){}
size_t stringLength(char*string){}
//字符常量指针的形式传参,防止字符串被修改
size_t stringLength(const char*string){}
//等价
int main(int argc,char**argv){}
int main(int argc,char*argv[]){}
//控制台输入
gcc main.c -o main
./main para1 para2
结果:
argc = 3
./main /*argv[0]为自身运行目录路径和程序名*/
para1 /*argv[1]指向第一个参数*/
para2 /*argv[1]指向第一个参数*/