c-notes

image

间接 标准 统一 机制 策略

iTerm 的配置

  1. 将iTerm移到应用程序

    进入配置文件

1
$ cd iterm$zsh/.oh my zsh/templates
  1. ls 查看当前目录下的所有文件

    拷贝当前目录下的文件 zshrc.zsh-template 到~/.zshrc 下

1
$ cp zshrc.zsh-template
  1. 退出iterm,重启即可
1
$ q

VI编辑器中的基本命令

VI编辑器中的基本内部命令

在终端使用 vimtutor 命令可以查看VI编辑器中的基本命令

  1. 复制命令

    复制单个字符: y

    复制一个单词: yw

    复制所选中的一行: yy

  2. 移动命令
    移动光标到行首: ^

    向前移动一个单词: b

    向后移动一个单词: w

    向下翻一页: ctrl + f

    向上翻一页: ctrl + b

  3. d + ^ 删除光标所在位置到行首的所有字符

  4. d + $ 删除光标所在位置到行尾的所有字符
VI编辑器中的基本外部命令
  1. 删除命令

     * rm [filename] 删除基本文件
     * rm -r [filename] 有提示的删除一个文件夹
     * rm -rf [filename] 强制删除文件夹,包括文件夹内的所有子文件夹以及自文件,且无提示 
      * rm \*~   (*为通配符),即删除所有以~结尾的文件
    
  2. 拷贝命令

     * 若file2文件家不存在,默认将file1 拷贝一分命名为file2 
     * 若file2时文件夹,默认将file1拷贝到文件夹file2下,且名字仍为file1 
     * file1 file2 不加路径的情况下,默认是把当前路径下的文件拷贝到当前路径下 
     * ile1 file2 表示为路径的形式,则是把指定路径下的file1 拷贝到指定路径下命名为file2,或是拷贝到制定路径下的file2文件夹下命名仍然是file1 
     * cp -r/R [file1][file2] 
     * 将文件夹1拷贝到文件夹2目录下 
    
  3. 重命名(移动命令)

    mv [file1][file2]

    • 若两文件在同一路径下且file2文件家不存在,默认将file1 重命名为file2
    • 若file2时文件夹,默认将file1移动到文件夹file2下,且名字仍为file1
      • file1 file2 不加路径的情况下,默认是把当前路径下的文件重命名为file2
    • file1 file2 表示为路径的形式,则是把指定路径下的file1 移动到指定路径下命名为file2,或是移动到指定路径下的file2文件夹下命名仍然是file1
  4. 其他命令

    • ls -a列出当前目录下的所有文件及文件夹,包括隐藏文件(以 “.” 开始的文件或文件夹)其中 . 和 ..两个文件夹表示是当前路径和上级路径
    • cd 切换路径
    • du -h [filename] 默认为查看当前路径下人类可读的文件的大小,追加filename,则是查看该文件夹下的人类可读的文件的大小
    • diff [file1][file2]比较两个文件内容是否相同,相同的话无显示结果;不同的话,则列出不同之处
    • file [file] 查看该文件的类型(如二进制类型,ASCII,English等)
    • !!调出上次使用的命令
      ! + 使用过的命令的首字母后第一个单词,调出最近使用过包含该字母或单词的命令
      ctrl + r 搜索使用过的命令
      ctrl + c 结束当前输入的命令,即不执行当前输入的命令
    • gcc 执行命令时 加-g 可进行调试 (l 列出函数的源代码,b 设置断点,r 运行程序,n 执行下一步,s 进入函数内部,p [var] 打印变量var的值 q 退出程序 ), 加 -save-temps 保留编译时生成的结果(即 .i, .s, .o 文件生成且被保留下来可供查看)
    • $?(echo $? 在屏幕上显示上次命令执行的结果,若执行成功则返回0,否则返回1;若上次执行是程序且执行成功则返回return 后的返回值)
      echo $HOME 显示当前的home路径
      echo $USER 显示当前的用户名
    • cat [filename] | head 查看文件的前十行内容

      注释方法

    • // 注释一行
    • 注释多行

      1. /*…*/
      2. #if 0

        #else

        #endif

        注释从 if 0 到else之间的多行,程序在编译,只编译else与endif之间的多行;若果把0换成非零值,则只

    • 头文件的保护

      #ifndef [宏名]

      #define [宏名]

      #endif

      在引用头文件时,如果未定义头文件内已定义过的内容,则定义;否则,不再重复定义

变量的作用范围

  1. 函数作用域 仅限在一个函数中使用
  2. 文件作用域 仅限在一个文件中使用
  3. 代码快作用域 受限与“ {}” 的限制
  4. 原型作用域 函数声明

变量的大小

  1. char c 语言标准规定为1字节
  2. int 一般为4字节 规定int的大小不超过long的大小,short的大小不超过int的大小
  3. 指针的大小与long的大小等于机器字长(即 32位os 其大小为4字节,64的os其大小为8字节),古可用sizeof(int)测试机器os时多少位的(sizeof只是一个操作符,并不是一个函数)。

数据类型

  • 整型:char short int long
  • 浮点型: float double
  • 指针
  • 聚合类型:数组,结构体,枚举类型
  • 派生类型:字符串,联合体

    赋值操作 值得注意点

  • 数组名是个地址,只能在初始化是对其赋值,在以后使用中,数组名是个地址常量,不能被作为左值对其赋值
  • 对字符数组初始化赋值为字符串字面常量,相当于把全局数据段的字符串复制到栈对字符数组分配的地址中去。
  • 指针是指针变量可以对其进行赋值运算
  • 结构体类型的变量可以作为左值对其进行赋值

分配内存问题

  • 在函数中定义变量,对其分配内存时不能太大
  • 可使用全局变量在全局数据段分配大内存
  • 可使用malloc(size)动态在堆中分配大内存,使用memset将申请的内存初始化。

字符串操作中段错误

  • 定义一个指向NULL地址的字符串指针
    NULL的ascii值为0,地址为0的内存不可以被访问,故对该地址进行写操作是没有权限的。
  • 在定义一个字符串数组时对其进行初始化为字符串字面常量
    对字符串数组定义并初始化为一个字符串字面常量时,字符数组首地址指向的是全局数据段的地址,对该段内存进行写操作是没有全县的。
  • 使用strcpy,strcat,strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy,strncat,strncmp,strncasecmp等字符串操作函数防止读写越界。

文件操作常用函数

  1. 字符读写 fgetc(FILE *fp);
1
fputc(int c,FILE*fp);
  1. 按行读写 fgets(char str,size,FILE \fp);
1
fputs(char \*,size,FILE *fp);
  1. 数据块读写 fread(char *,size,number,FILE *fp);
1
fwrite(char \*, size,number,FILE \*fp);
  1. 格式化读写 fprintf(FILE *fp,format,…);
1
fsanf(FILE *fp,format,...);
三种缓冲机制
  • 行缓冲 缓冲区存储一行信息才进行输出 eg:stdout(标准输出)
  • 全缓冲 缓冲区存储满信息才进行输出
  • 无缓冲 缓冲区只要有信息存储进去就进行输出 eg:stderr(报错)
    改变文件指针位置
    • rewind(FILE *fp); 改变指针指向头文件
    • fseek(FILE *fp,int length,long where);(where 可取值为SEEK_SET SEEK_CUR SEEK_END) 改变指针位置从(文件头部,当前位置,文件尾部)移动length个字节的位置

image