zoukankan      html  css  js  c++  java
  • 预处理+字符串

    预处理

    一、什么是预处理

    预处理指的的就是代码在执行指向所做的事情,以#开头

    二、常见的预处理

    include<xxx.h>

    使用<>,编译器会到系统的路径下找头文件,找不到就会报错

    使用"xxx.h",系统会首先到当前目录,也就是你的程序所在的目录,没有就去系统的路径下去找,找不到会报错

    注意:包含系统的头文件就用<>,包含自己写的头文件就用"".

    三、#define==》宏替换,是一个预处理命令

    1.#define是C语言的宏定义,本质是替换,会在预处理阶段对程序中所有出现"宏名"的地方进行替换

    一般替换代码比较少的

    2.定义:

    define 宏名 内容==》看你自己加不加分号

    define 宏名 {代码段}

    #define  PI 3.1415926
    #define add 1+4
    int main()
    {
        double a=PI;
        //等价于
        //double a=3.1415926;
        
        int a=2*add;
        //答案是2*1+4=6;
        //只是替换,不会进行其他操作
        
    }
    
    3.实例
    #include <stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define SIZE 10
    
    //#undef SIZE
    //取消宏定义
    
    //可以运用到推箱子这样的程序,循环比较多的,方便改动
    int main()
    {
    	srand((unsigned int)time(NULL));//随机数种子
    	//printf("%d", rand()%10);
    	int arr[SIZE] = { 0 };
    	for (int i = 0; i < SIZE; i++)
    	{
    		arr[i] = rand() % 10+1;//随机生成1-10范围的随机数
    		printf("%d ", arr[i]);
    	}
    	getchar();
    	getchar();
    	return 0;
    }
    
    
    
    
    4.带参数的宏定义

    带参宏:以空间换时间,没有入栈出栈

    #define add(a,b) a+b
    //形参没有类型,没有返回值,本质是替换
    //什么类型都行,但要考虑两者能不能相加
    //比如结构体就不能相加
    
    
    int add(int a,int b)
    {
        return a+b;
    }
    //以时间换空间
    //形参有类型,有返回值,本质是替换,函数有入栈出栈
    
    
    /*
    虽然这个函数和上面的宏定义效果一样,但这个函数只能相加int类型的数,而宏定义没有规定类型,可以是整型,浮点型,...之类的相加
    */
    
    int main()
    {
        int a=add(1,2);
        printf("%d
    ",a);//输出3
    }
    

    四、头文件,预编译条件

    #pragma once :
    只包含一次,用来防止重复包含

    就是说你写了两个一样的#include<stdio.h>,但是只会展开一次这个头文件

    C语言中:

    #ifdef  宏名
    //
    // 代码段
    //
    #endif
    
    
    #ifdef  宏名
    //
    //   代码段1
    //
    #else
    //
    //   代码段2
    //#endif
    //如果宏名定义了执行代码段1,没有定义执行代码段2
    
    /*
    #pragma once
    
    //只适用于windows
    
    
    #ifndef  ==》如果没有定义这个宏名,那么就执行下面的代码
    
    #define==》那么就会定义它
    可以跨平台
    
    代码块
    
    #endif
    
    ==>活动预处理器块
    
    就是说开始你是没有定义宏名的,当你写了#include<stdio.h>时,那个宏名就被定义了,如果你写了两个#inlcude<stdio.h>,但是第一次已经定义了,所以从#ifndef开始就不会执行下面的代码了
    
    */
    

    五、几个常用的预处理命令

    #include<stdio.h>
    int main()
    {
        printf("%d
    ", __LINE__);//输出当前行号
    	printf("%s
    ", __FILE__);//输出编译文件名字
    	printf("%s
    ", __DATE__);//输出当前编译日期
    	printf("%s
    ", __TIME__);//输出当前编译时间
    }
    

    六、字符串

    char nn[5]={"abcd"};
    //这样才是对的,有五个字节空间,但是要留一个字节给,'',结尾
    
    //如果用
    scanf("%s",nn);
    //如果输入as x
    //那么只会输出as,因为只会输出空格之前的内容
    
    //字符串数组要用strcpy来拷贝,将一个字符串里的内容赋给另一个字符串
    
    char a1[10]={"avade"};
    char a2[10]={"kjds"};
    strcpy(a1,a2);
    if(strcmp(a1,a2)==0)
    {
        printf("两个字符串相等");
    }
    else
    {
        printf("两个字符串不相等");
        
    }
    
    char s[10] = { 0 };
    	for (int i = 0; i < 9; i++)
    	{
    		sprintf(&s[i], "%d", i);
    	}
    	puts(s);
    //输出012345678
    
    
    
    int arr[10];
    	memset(arr, 0, sizeof(arr));
    	for (int i = 0; i < 10; i++)
    	{
    		printf("%d", arr[i]);
    	}
    	//memset按位赋值,作用初始化一块地址
    
    char s1[10] = "snwjdb";
    	char s2[10] = { 0 };
    	memcpy(s2, s1 + 3, 3);
    //效果是将s1中的jdb拷贝到s1中,将后面的考给前面
    int a = 10;
    	int b = 20;
    	memcpy(&a, &b, 4);//int是四个字节
    	printf("a=%d	b=%d
    ", a, b);
    //输出是a=20,b=20;
    

    strcmp(s1,s2)

    比较第一个字符的大小,比的ASCII码表中对应的十进制数

    返回值为0,两个字符串相等

    返回值<0,s1<s2

    返回值>0, s1>s2

    //gets将回车视为输入结束的标志,空格不是,所以可以实现输入带空格的字符串

    gets只能用于字符串的输入

    1.字符串数组要用strcpy来拷贝,将一个字符串里的内容赋给另一个字符串

    2.puts();==>输出字符串,自动换行

    3.strlen==>求字符串的有效长度,不包括'',而sizeof()是求类型大小的

    4.strcmp==>比较字符串是否相等 strcmp(s1,s2)

    5.sprintf的功能是将格式化内容输出到字符串

    6.memset按位赋值,作用初始化一块地址

    7.memcpy 内存拷贝,按字节拷贝

    strncat的功能是字符串的有限追加,防止溢出

    strcat的作用是字符串追加,也叫字符串拼接

    sscanf的功能是从指定格式化字符串读取输入

    strchr的功能是查找字符,没有找到的话返回NULL

    2.34

  • 相关阅读:
    文件下载(Servlet/Struts2)
    Spring学习(一)---依赖注入和控制反转
    MyBatis学习(三)---MyBatis和Spring整合
    MyBatis学习(二)---数据表之间关联
    MyBatis学习(一)---配置文件,Mapper接口和动态SQL
    转载:常见端口介绍
    CentOS7 yum提示:another app is currently holding the yum lock;waiting for it to exit
    批量删除文件,只保留目录下最新的几个文件,其他均删除
    转载:SQL Server 如何设置数据库的默认初始大小和自动增长大小
    阿里云ECS使用秘钥或者密码登录
  • 原文地址:https://www.cnblogs.com/Kissfly123/p/14123270.html
Copyright © 2011-2022 走看看