指针和字符串

字符串基础

字符串是以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]指向第一个参数*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值