day05(补) 字符数组 字符串操作函数 宏定义

来源:互联网 发布:金蝶会计软件 编辑:程序博客网 时间:2024/05/21 22:21
   //数组元素存储的是字符
#pragma mark-字符数组
    //定义字符数组
  
// char a[5]={'h','e','l','l','o'};
   
//char b[]={'h','e','l','l','o'};
   
//char c[10]={'h','e','l','l','o'};
  
// char d[]="hello";
   
   
//默认设置'\o''\o'是空操作符,不显示。
   
   
//修改前
//    for (int i=0; i<5; i++) {
//        printf("%c",b[i]);
//    }
//    printf("\n");
//    //访问和修改
//    b[1]='a';
//    for (int i=0; i<5; i++) {
//        printf("%c",b[i]);
//    }
//    printf("\n");
//   
//    c[1]='\0';
//    for (int i=0; i<5; i++) {
//        printf("%c",c[i]);
//    }
   
   
//字符串
   
//1.字符串常量,“hello world”
   
//2.使用字符串数组存储字符串
   
//3.使用%s,输出字符串
   
   
//定义字符串数组存储字符串
   
//char a[]="hello world";
   
   
//系统如何识别字符串:‘\0’,数据存储在内存中,系统识别那些字符属于一个完整的字符串。
   
//‘\0’ 是字符串结束标志,在字符串的最后一位,由系统默认添加,空操作,不可以显示。
   
//"hello "存储时,实际上是'h','e','l','l','o','\0'
   
//有效字符:在字符串中,\0之前的都是有效字符
   
//存储字符串的字符数组元素个数= 有效字符个数 + 1

   
//输出字符串
//printf("%s\n",a);
   
   
//字符串和字符数组的关系
   
//1.字符串是一个字符数组
//    char a1[]="hello";
//    char b1[]={'h','e','l','l','o'};
//    printf("%s",b1);
   
//ab都是数组
   
//1.两个数组中存储的内容都是字符串  hello
   
//2.字符数组不一定是一个字符串
   
//3.都可以访问,修改数组元素,遍历
//    a1[0]='a';
//    for(int i=0;i<sizeof(b1)/sizeof(char);i++)
//    {
//        //printf("a1[%d]=%c,b1[%d]=%c\n",i,a1[i],i,b1[i]);
//       
//        printf("b1[%d]=%c\n",i,b1[i]);
//    }
   
//2.字符数组不一定是一个字符串
//    char a[]={'L','a','n','o','u'};
//    char b[]="Lanou";
   
//ab都是字符数组
   
//数组a中存储了5个字符;数组b中存储了6个字符,存储的是一个字符串
   
//使用{}方式初始化字符数组时,如果数组元素包括'\0',存储的内容才能成为字符串
   
//练习
   
//char a[]="xiAn lanou";//数组中a有几个元素,有几个有效字符呢    11 10
   
//printf("%ld",sizeof(a));
   
//char b[20]="beijing lanou";//数组中b又有几个元素呢?几个有效字符呢? 20 13
  
// printf("%ld",sizeof(b));
   
   
//3.存储字符串数组,可以输出单个字符,也可以使用%s输出完整字符串,使用%s输出时,遇到'\0'时结束输入
//    char a[]="lanou";
//    for (int i=0; i<6; i++) {
//        printf("%c\n",a[i]);
//    }
//    printf("\n");
//    printf("%s\n",a);
//    char b[]={'l','a','\0','o','u','\0'};
//    printf("%s\n",b);
   
//4.只是存储字符的数组,只能输出单个字符
//    char a[]={'l','a','n','o','u'};
//    for (int i=0; i<5; i++) {
//        printf("%c",a[i]);
//    }
//    printf("\n");
//    printf("%s",a);
#pragma mark-字符串操作函数
    //1.strlen 测量字符串的长度
   
//2.测量的是字符串的实际长度,不含'\0'
//    char name[]="wangnima";
//    printf("%s的实际长度%lu\n",name,strlen(name));
   
   
//strcpy字符串拷贝
//    char a[10]={0};
//    char b[]="lanou";
   
//strcpy(字符数组1,字符数组2);
   
//将字符串2复制到字符数组1
//    strcpy(a, b);
//    printf("%s\n",a);
   
//字符串2是常量,字符数组名strcpy(a,"wangnima");
   
//字符数组1的存储空间>= 字符串2
//    char a[10]={0};
//    char b[]="lanou";
   
//注:给一个字符数组赋值,只能使用strcpy,不能直接对一个字符数组赋值。
   
//a=b;//错误
   
//3.strcat拼接
//    char a_1[30]="hello ";
//    char b_1[]="lanou";
   
//strcat(字符串数组1,字符串数组2); 将字符串2拼接到字符串1后面,结果保留在字符串1
   
//字符数组2可以是常量
   
//字符数组1的存储空间必须足够大
   
//拼接之后,字符串1‘\0’取消,只能在新的字符串后面保留'\0'
//    strcat(a_1, b_1);
//    printf("a_1=%s,b_1=%s\n",a_1,b_1);
   
//字符串的比较
//    char a[]="apple";
//    char b[]="goole";
   
//strcmp  字符串的比较
   
//2字符串自左向右逐个比较(按照ASII码值大小比较),直到出现不同的字符或遇'\0'为止
   
//字符串1的字符>=字符串2的字符
   
//字符串1=字符串2,则函数结果为0
   
//字符串1 <=字符串2,则结果为负整数
//    printf("%d\n",strcmp(a, b));//字符串1 <字符串2
//    printf("%d\n",strcmp(b, a));//字符串1 >字符串2
//    printf("%d\n",strcmp("apple","apple"));//字符串1 =字符串2
//   
//    printf("%d\n",strcmp("app","appl"));//字符串1 <字符串2
   
//练习:查找字符串中的空格数
   
//比如:"I love iOS, i want an iPhone6"
//    char str[]="I love iOS, i want an iPhone6";
//    int count=0;
//    for (int i=0; i<sizeof(str)/sizeof(char); i++) {
//        if (str[i]==' ') {
//            count++;
//        }
//    }
//    int n=0;
//    while (str[n]!='\0') {
//        if (str[n]==' ')
//        {
//            count++;
//        }
//        n++;
//    }
//    printf("count=%d",count);
   
//练习:将字符串倒转,例如“afjnpue”,转成字符串“eupnjfa”(是改变字符串本身,而不是反向输出)
   
//    char str[]="afjnpue";
//    int length=(int)strlen(str);//强转
//    //printf("%d\n",length);
//    for (int i=0; i< length/2; i++)
//    {
//        int tmp=str[i];
//        str[i]=str[length-1-i];
//        str[length-1-i]=tmp;
//    }
//   
//    printf("%s",str);
#pragma mark-宏定义
    //宏定义的概念及参宏定义方法
   
//1.宏的概念
   
//被定义为的标识符被称为宏名,在编译过程中,对程序中所有出现的宏名都换成宏定义中的字符串去代换,宏定义中是由源程序中的宏定义命令完成的,宏代换事由预处理程序自动完成的。在c语言中,宏分为有参宏和无参宏两种。
   
//预处理:概念。以#号开头的预处理命令,如包含#include.宏定义命令#define等。在源程序中这些命令都放到函数之外,我们称他们为预处理部分。
   
//凡是以#开头的均为预处理命令,“define”为宏命令。标识符为所定义的宏名,字符串可以事常量,表达式,格式串等等
   
//#undef PI
   
//无参宏的使用注意事项:
   
//1.习惯上宏名用大写字母表示,以便于变量区别,但也允许用小写字母。
   
//2.宏定义不是说明语句,在行末不必加号,如果加,会将一并替换。
   
//3.宏名在源程序中若用“”括起来,则预处理程序不对其做宏替换
   
//4.宏定义允许替换,在宏定义的字符串中可以使用已经定义的宏名,在宏展开是由预处理程序层代换。
#define PI 3.1415
#define H helloworld
#define STU struct stu
#define INT int
#define p printf
#define D
"%d\n"
    INT a=12;
   
struct stu
    {
       
char *name;
       
int age;
    };
   
STU s1={"sb",a};//定义一个结构体并赋值
   
printf("name:%s,age:%d",s1.name,s1.age);
    p(D,s1.age);

//有参宏
   
//#define 宏名(形参) 字符串
   
//字符串中含有个个形参
   
//带有宏调用的一般形式为#define M(y) y*y+3*y
#define M(y) y*y+3*y
#define SUM(a,b)  a+b
    INT k=M(5);
   
printf("%d\n",k);
   
printf("%d\n",SUM(12,65));
 //注意事项:1.带参宏定义中,形参之间可以出现空格,但是宏名和形参之间不能有空格出现。
   
//2.在宏定义中的形参事标示符,而宏调用中的实参可以是表达式;在宏定义中,字符串内的形参通常要用括号括起来,意面出错。
   
//如上例:(x)*(y)表达式的y都用括号括起来,因此结束是正确的。
   
//4.宏定义也可以用来定义多个语句,在宏调用时,把这些语句又替换到源程序中。
#define JI(a,b)  a=i+3; b=j+4;
#define MAX(a,b) (a>b)? a:b
    int i=4,j=2;
   
int m=0;
   
int n=0;
   
JI(m,n);
   
printf("i=%d,j=%d\n",m,n);
   
printf("max=%d",MAX(i, j));
0 0
原创粉丝点击