011_stdc_C语言

回顾:

 1 const 限定存储空间的只读   
int a[]; a=pa;


2 字符串
int float string 一串字符+ 就是字符串

char *str = "hello wolrd"

char pa[10]="hello";


%s 格式化占位符 char *str

gets(str) -->fgets() //
puts(str) --> 输出字符串


printf("hello world ");
puts("hellow worold ");


字符串里面的操作函数
strcpy 字符串复制
strcmp 比较字符串的大小
strlen 字符个数
strlen("好");

strcat 连接多个字符串

字符串转换练习
_______________

      int atoi(char *str);   //将一串字符转换为int

itoa //将int 转字符串
atof(); //"3.14" --> 3.14

char *p 指向一个字符串(字符指针)
1. 字符指针 数组
char *pa[5] //指向多个字符串

2.
char a[] //一个字符串
char a[5][10] //5个字符串,每个字符串9字符

3. char **ppa   //字符串指针(字符串指针)

/*
 * 字符串数组
 */
char a[5][10] ={"关羽","张飞","刘备","赵云","小乔"};

//输入一个姓名 ,判读 该同学是否在上面的名单中

#include <stdio.h>
#include <string.h>

int main(){
    char a[5][10] ={"关羽","张飞","刘备","赵云","小乔"};

    char name[10] = {0}; //用来存放输入的姓名
    for(int i = 0;i<5;i++)
    {
        printf("%s
",a[i]);
    }
     
    //输入一个姓名 ,判读 该同学是否在上面的名单中
    printf("输入姓名:");
    scanf("%s",name);

    for(int i = 0;i<5;i++)
    {
         if(0 ==strcmp(a[i],name))
             printf("名单中有该同学
");  
    }
    getchar();
    getchar();
    return 0;
}

   带参数的执行程序(命令)  mkdir ls  cd cp

第一种
   int main();

第二种
   int  main(int argc,char*argv[]);

argc argc 参数个数,也是字符串的个数
argv argv 记录所有字符串的内容

linux系统下

/*
 * 带参数的main函数
 * [练习]
 *      在理解下面程序的基础上 实现 打印任意多个参数的可执行程序
 *      实现多个数(参数)和的加法命令
 */
#include <stdio.h>
#include <stdlib.h>
int  main(int argc,char*argv[]){

    int sum = 0;
    printf("argc = %d
",argc);
    for(int i = 1;i<argc;i++)
    {
        sum = sum + atoi(argv[i]);
        //printf("argv[%d] = %s
",i,argv[i]);
    }
    printf("sum = %d
",sum);
    return 0;
}

---------------------
构建大型项目

程序的编译过程
    预处理--> 编译--> 汇编--> 链接 -->可执行文件
     main.c->main.i--> main.s main.o printf.o a.out

gcc -E main.c -o main.i  得到预处理后的文件main.i
gcc -S main.i            得到main.s 文件,汇编源文件
gcc -c main.s            得到main.o 文件
gcc main.o               得到a.out 可执行文件

预处理
执行预处理语句, 以#开始的语句就是预处理语句

头文件
#include 将后面的文件 放到当前的.c 文件中

#define
                   宏变量

         #define  PI  3.14
         s = PI * r * r;
宏是暂时代替变量,预处理时把变量替换成数值

宏函数

#define  DOUBLE(n)   ((n)+(n))        //
int s = DOUBLE(5)  //5+5
/*
 * 写一个宏函数 返回 两个参数的最大值
 * 写一个返回一个数的 绝对值的宏函数ABS
 */
#include <stdio.h>
#define  DOUBLE(n)   ((n)+(n))
#define MAX(a,b)     ((a)>(b)?(a):(b))
#define ABS(n)       ((n)>=0?(n):-(n))

int max(int a,int b)
{
    /*
    if(a>b)
        return a;
    else
        return b;
   */
    return a>b?a:b;
}

int main(){
    printf("max = %d
",MAX(5*1,2+7));
    printf("|-2| = %d
",ABS(-2));
    printf("|-7-2| = %d
",ABS(-7-2));
    getchar();
    return 0;
}

条件编译
       #if 如果#if 后的常数 非0 编译语句参与编译
       #else      如果#if 后的常数 为0  编译语句参与编译
       #endif     条件编译#if结束
       #define WIN    //条件定义符号  WIN

       #ifdef WIN //如果定义了符号WIN 编译下面的代码
       #ifndef WIN    //如果没有定义了符号WIN  编译下面的代码

#define WIN 
#undef WIN
int max(int a,int b)
{
#ifdef  WIN    //#ifndef
    if(a>b)
        return a;
    else
        return b;
#else
   
    return a>b?a:b;
#endif
}
       内置宏定义
       __FILE__      当前.C 文件名
       __LINE__      文件的行号
       __DATE__      文件的编译日期
       __TIME__      文件的编译时间
#include <stdio.h>
int main(){
    printf("当前.c文件的文件名=%s
",__FILE__);

    printf("当前代码的行号 %d
",__LINE__);
    printf("当前可执行文件编译日期 %s
",__DATE__);
    printf("当前可执行文件编译时间 %s
",__TIME__);
//
printf("使用的C编译器吗 %d ",__STDC__);
    getchar();
    return 0;
}

#include  文件查找方式
    <> 系统目录 /usr/include/
     "" 当前目录+系统目录

[练习]
编写add.c 文件 在该文件中 定义一个 int add(int a,int b)
编写add.h 文件 在该文件中声明 add 函数的原型


编写 main.c 在main函数中
#include add.h
调用add函数实现两个数的和,

编译测试 gcc main.c add.c

static 修饰函数时,限定该函数只能在 当前.c文件使用
static 修饰的函数名 在不同.c 文件中可以重名

static 修饰全局变量名 该变量限于在当前.c文件访问

extern 修饰函数名/变量名 具有外部链接属性

   头文件 还可以包含头文件,用头文件卫士 避免(重复引用)

如:print.h头文件中

#ifndef __PRINT_H__ //防止头文件交叉引用
#define __PRINT_H__ //头文件卫士

add.h投文件中

#ifndef __ADD_H__
#define __ADD_H__
   make  makefile
#目标:依赖的文件(目标顶格写,多个依赖文件用空格隔开)
#    命令  (前面是一个tab键)
[练习]
    为add 编写一个makefile 文件  并用make进行编译

add:main.o add.o print.o
    gcc main.o add.o print.o -o add

main.o:main.c add.h print.h
    gcc -c main.c

add.o:add.c add.h
    gcc -c add.c

print.o:print.c print.h
    gcc -c print.c
 
何所为,不仅仅是一种态度,更是一种艺术!
原文地址:https://www.cnblogs.com/tanzizheng/p/12909570.html