Linux和C语言(Day02)

一、学习内容

1、cp命令

①cp file1 file2

如果file2不存在,表示将file1复制一份儿取名为file2。

如果file2存在,表示将file1复制一份儿取名为file2,并覆盖原来的file2

②cp file1 dir1

将文件file1复制一份放到dir1里面名字还叫file1

③cp -r dir1 dir2

如果操作的是目录文件 需要加选项-r

如果dir2 不存在,表示将目录文件dir复制一份取名dir2

如果dir2 存在,表示将目录文件dir1 复制一份放到dir2里面

2、cat命令

①cat 文件名

查看文件内容

②cat -n 文件名

查看文件内容,显示行号

③cat file1 file2

可以将多个文件的内容连接在一起并显示出来

④cat file1 > file2

可以将文件内容写入到另一个文件中,覆盖原有内容。

file1 的内容写入 file2,如果 file2 存在,原内容会被覆盖。

⑤cat file1 >> file2

使用 >> 可以将文件内容追加到另一个文件的末尾,而不覆盖原内容,这会将 file1 的内容追加到 file2 的末尾。

3、mv命令

①mv file1 file2

如果file2不存在,表示将file1重命名为file2

如果file2不存在,表示将file1重名为file2,覆盖原来的file2

②mv file1 dir1       

如果目录dir1 中没有叫file1的文件,表示将file1移动到dir1里面

如果目录dir1中有叫file1的文件,表示将file1移动到dir1里面,并覆盖原来的file1

③mv dir1 dir2

如果dir2不存在,表示将目录文件dir1重命名为dir2

如果die2存在,表示将目录dir1移动到dir2里面

4、echo命令

echo 最基本的功能就是输出指定的文本

②可以使用 echo 来输出变量的值

③显示换行符和转义字符: 使用 -e 选项可以使 echo 解释转义字符

④抑制输出后的换行符: 使用 -n 选项可以在输出末尾不自动添加换行符

⑤可以使用 >>>echo 的输出重定向到文件

echo "This is a test" > file.txt
这会将文本 This is a test 写入 file.txt,如果文件存在,会覆盖内容。

使用 >> 可以将文本追加到文件末尾,而不覆盖原有内容:

echo "This is another test" >> file.txt

5、Tab键补齐

功能:

补全指令或 两次Tab进行提示

补全规则:

如果给定的信息足以确定唯一的内容 按一下tab键就可以补全

如果不足以确定唯一的内容 按两下tab键 会提示可以补全哪些内容,再根据提示 输入一些关键信息 按tab键就可以补全了

注意:

对于文件名的操作,建议尽量使用 tab 键补齐,一来快,二来出错概率小。

6、vim/vi编辑器

gedit:用于桌面的文本编辑器【txt】

vim/vi:一个程序员的文本编辑器

vi是旧版本

vim是新版本,添加了撤回 反撤回 高亮显示等

7、打开vim/vi编辑器

指令 vim

只是打开编辑器

指令 vim 文件名

新建文件,并打开文件

指令 vim -o 1.c 2.c

上下打开两个文件

指令 vim -O 1.c 2.c

左右打开两个文件

注意:touch 和 vim的区别

touch

新建保存不打开

vim

新建打开不保存

8、三种模式

①命令行模式

光标选中y    复制选中的

光标选中d    剪切选中的

yy                 复制光标所在行

p                  在光标下一行粘贴

P(shif+p)      在光标上一行粘贴

u                  撤销一步

ctrl+r           重做【反撤销】

dd               剪切/删除光标所在行

2yy              从光标处开始复制2行

3dd             从光标处开始剪切3行

gg              光标定位到首行

G              光标定位到尾行

ggyG         全文复制 

ggdG       全文剪切

②插入模式【写代码的】

按下Esc按键

i             光标前 输入

I            光标所在行的行首 输入

③底行模式

按下Esc按键,shift + :

:w             保存

:q             退出

:wq          保存退出

:q!             强制退出

:wqa           保存退出所有打开的文件

:vsp          文件名 若文件存在,左右打开新文件;若文件不存在,新建打开

9、gcc编译器

计算机的语言三代:

机器语言:能直接被计算机识别,二进制(0 1)语言 【执行速度最快】

汇编语言:使用助记符号来替代机器语言

高级语言:使用人类日常的语言,英文、数字等 【执行速度最慢】

我们写好的C语言代码【高级语言】称之为源文件,需要转换成计算机能理解的二进制语言,才能被计算机执行。

高级语言 ------>汇编语言 ------->机器语言 ------->执行代码显示结果

从高级语言到机器语言,需要使用编译器/解释器。

目前来说我们的高级语言分为编译型语言和解释型语言。

在Linux系统下我们选用gcc编译器,让高级语言转换成二进制语句被计算机识别处理。

10、编译方式

①最简单的方式

第一步:直接编译 gcc XXX.c

第二步:执行 ./a.out

②自定义可执行文件名

第一步:自定义可执行文件名 gcc XXX.c -o 自己起个名字

第二步:执行 ./自己起的名字

③按照流程分步编译

1、预处理 展开头文件、替代宏、删除注释

gcc -E XXX.c -o XXX.i

2、编译 检查语法错误和警告,把高级语言转换成汇编语言

gcc -S XXX.i -o XXX.s

3、汇编 把汇编语言转换成二进制语言

gcc -c XXX.s -o XXX.o

4、链接 生成可执行文件

gcc XXX.o -o exe

5、执行

./exe

11、脑图总结

二、Day02作业

1、练习1

题目:

1.在用户的家目录下创建 目录文件 dir1 和 普通文件file1

2.在家目录下给dir1目录嵌套创建 dir1/dir2/dir3/dir4/dir5

3.在家目录下直接一步进入到 dir4 里面

4.在dir4目录中将家目录下的file1 移动到上一级的dir3中

5.在dir4目录下创建一个目录文件 test

6.将test 复制到上一级的dir3中

7.在dir4中直接查看dir3中有哪些文件

8.在dir4中直接回到家目录 删除刚才创建的目录 dir1

解答代码块:

//回到家目录
cd ~
//创建目录文件dir1
mkdir dir1
//创建普通文件file1
touch file1
//嵌套创建文件
mkdir -p dir1/dir2/dir3/dir4/dir5
//直接进入dir4
cd dir1/dir2/dir3/dir4
//在dir4中操作家目录的文件至上一级dir3中
mv ~/file1  ../
//创建test目录文件
mkdir test
//复制文件
cp -r test  ../
//查看dir3
ls ../
//回到家目录
cd ~
//删除目录中的dir1
rm -r dir1

附属图片:

2、作业2

题目:

  1. 创建目录24081C,在该目录下创建目录dir1 dir2 文件file1
  2. 使用echo在file1中打印一首古诗【执行调整格式】
  3. 复制file1给file2
  4. 将file1移动到dir1
  5. 将file2移动到dir2
  6. 在file1后面追加一行语句“我爱C语言”
  7. 查看file1内容

解答代码块:

//创建 目录
ubuntu@ubuntu:~$ mkdir 24081C
//进入所创建的目录
ubuntu@ubuntu:~$ cd 24081C/
//在目录下创建dir1和dir2目录文件夹 以及file1文件
ubuntu@ubuntu:~/24081C$ mkdir dir1 dir2
ubuntu@ubuntu:~/24081C$ touch file1
//查看是否创建完成
ubuntu@ubuntu:~/24081C$ ls
dir1  dir2  file1
//使用echo在终端中打印古诗
ubuntu@ubuntu:~/24081C$ echo -e "\t\t君不见,黄河之水天上来,奔流到海不复回。\n\t\t君不见,高堂明镜悲白发,朝如青丝暮成雪!\n\t\t人生得意须尽欢,莫使金樽空对月。\n\t\t天生我 材必有用,千金散尽还复来。\n\t\t烹羊宰牛且为乐,会须一饮三百杯。\n\t\t岑夫子,丹丘生, 将进酒,杯莫停。\n\t\t与君歌一曲,请君为我倾耳听。\n\t\t钟鼓馔玉不足贵,但愿长醉不复醒 。\n\t\t古来圣贤皆寂寞,惟有饮者留其名。\n\t\t陈王昔时宴平乐,斗酒十千恣欢谑。\n\t\t主 人何为言少钱,径须沽取对君酌。\n\t\t五花马、千金裘,呼儿将出换美酒,与尔同销万古愁!"
//效果呈现
		君不见,黄河之水天上来,奔流到海不复回。
		君不见,高堂明镜悲白发,朝如青丝暮成雪!
		人生得意须尽欢,莫使金樽空对月。
		天生我材必有用,千金散尽还复来。
		烹羊宰牛且为乐,会须一饮三百杯。
		岑夫子,丹丘生,将进酒,杯莫停。
		与君歌一曲,请君为我倾耳听。
		钟鼓馔玉不足贵,但愿长醉不复醒。
		古来圣贤皆寂寞,惟有饮者留其名。
		陈王昔时宴平乐,斗酒十千恣欢谑。
		主人何为言少钱,径须沽取对君酌。
		五花马、千金裘,呼儿将出换美酒,与尔同销万古愁!
//查看file1中的内容是否正确进入
ubuntu@ubuntu:~/24081C$ cat file1
//复制file1给file2
ubuntu@ubuntu:~/24081C$ cp file1 file2
ubuntu@ubuntu:~/24081C$ cat file2
//移动 file1进入 dir2
ubuntu@ubuntu:~/24081C$ mv file1 dir1
//查看是否完成
ubuntu@ubuntu:~/24081C$ ls dir1
file1
//移动file2 进入dir2
ubuntu@ubuntu:~/24081C$ mv file2 dir2
ubuntu@ubuntu:~/24081C$ ls dir2
file2
//在file1追加内容
echo -e "我爱C语言" >> dir1/file1
//查看file1的内容
ubuntu@ubuntu:~/24081C$ cat dir1/file1
//结果
		君不见,黄河之水天上来,奔流到海不复回。
		君不见,高堂明镜悲白发,朝如青丝暮成雪!
		人生得意须尽欢,莫使金樽空对月。
		天生我材必有用,千金散尽还复来。
		烹羊宰牛且为乐,会须一饮三百杯。
		岑夫子,丹丘生,将进酒,杯莫停。
		与君歌一曲,请君为我倾耳听。
		钟鼓馔玉不足贵,但愿长醉不复醒。
		古来圣贤皆寂寞,惟有饮者留其名。
		陈王昔时宴平乐,斗酒十千恣欢谑。
		主人何为言少钱,径须沽取对君酌。
		五花马、千金裘,呼儿将出换美酒,与尔同销万古愁!
我爱C语言

3、作业3

题目:

  1. 使用gcc 程序编译生成可执行文件的步骤分为________、________、________、________ (鲁科安全)
  2. GCC编译器中 -S 选项完成的工作是________ (鲁科安全)
  3. 写出gcc分步编译的详细步骤。
  4. C语言的程序的入口函数是什么,请写出全称?(山东丁一)
  5. 用户编写了一个文本文件a.txt,想要得到一个名为txt.a的该文件,可以使用哪些指令呢?
  6. 分析一下#include <stdio.h>的意思

    #表示:

    include表示:

    stdio.h表示:

    <>可以改为””吗?二者的区别是什么?

解答:

1.预处理、编译、汇编、链接

2.词法语法的分析,检查是否有错误以及如果无误,生成汇编文件

3.预处理:头文件的展开、注释的删除、宏定义的替换

gcc -E xxx.c -o xxx.i

2.编译:词法分析、语法分析 --查错的

如果无误,会生成汇编文件

gcc -S xxx.i -o xxx.s

3.汇编:将汇编文件生成二进制文件

gcc -c xxx.s -o xxx.o

4.链接:链接需要用到的库文件,最终生成可执行文件

链接库需要加编译选项 -l

gcc xxx.o -o a.out

4.C语言程序的入口函数是 `main` 函数,全称是 `int main(int argc, char *argv[])` 或者 `int main(void)`。

 int main(int argc, char *argv[]):       
   - `int` 表示 `main` 函数的返回类型是整数。
   - `argc` 表示命令行参数的个数,包括程序本身的名字。
   - `argv` 是一个字符串数组,存储了命令行参数,每个参数都是一个字符串。

   这种形式通常用于需要从命令行获取输入参数的程序。

`int main(void)`:
   - 这种形式表示程序不接受任何命令行参数。

无论采用哪种形式,`main` 函数的返回值一般是 `0`,表示程序正常结束,非零值通常表示程序出现错误或异常情况。

5.①mv  a.txt  txt.a

② cp a.txt txt.a
rm a.txt

③cat a.txt > txt.a
rm a.txt

6.

在 C 语言中,`#include <stdio.h>` 是一个预处理指令,用于包含头文件。以下是对每个部分的详细解释:

`#` 表示:
`#` 是预处理指令的起始符号,用于告诉编译器接下来的内容是一个预处理指令。预处理指令在编译过程中会在编译器实际编译源代码之前被处理。

`include` 表示:
-`include` 是预处理指令,指示编译器将指定的文件的内容包含到当前源文件中。这个文件通常是一个头文件,其中包含了函数声明、宏定义、数据结构等,可以在多个源文件中共享。

`stdio.h` 表示:
`stdio.h` 是一个头文件的名字,全称为 "Standard Input Output" 的头文件,包含了输入输出函数的声明,比如 `printf`、`scanf`、`fopen`、`fclose` 等。这些函数用于处理标准输入和输出,以及文件操作等功能。

 `<>` 和 `""` 的区别:

`<>`:
  - 用于包含系统或标准库头文件。编译器会在系统的标准头文件目录中查找这个文件。例如,`#include <stdio.h>` 会在标准库的头文件目录中查找 `stdio.h` 文件。
  
`""`:
  - 用于包含用户自定义的头文件。编译器首先会在当前源文件所在的目录中查找这个文件。如果找不到,才会去标准头文件目录中查找。例如,`#include "myheader.h"` 会首先在当前目录查找 `myheader.h`,如果找不到,再去标准目录查找。

总结:

- `#include <stdio.h>` 用于包含标准库的头文件 `stdio.h`。
- `#include "myheader.h"` 用于包含用户自定义的头文件 `myheader.h`。

使用 `<>` 和 `""` 主要是为了指示编译器查找头文件的位置不同。

三、总结

对Linux的命令和操作系统有了一定基础的了解,与windows的操作系统相比,多样化界面以及命令行界面有了更多的可操作性。

比如:Linux 支持多种桌面环境(如 GNOME、KDE Plasma、XFCE、LXDE 等),用户可以根据自己的需求选择和自定义。以及inux 系统提供强大的命令行接口(CLI),用户可以通过终端执行各种操作。

在C语言的学习过程中,更多的是重新从底层慢慢了解C语言的结构,以及它的编译器,和编译器的编译过程,对于过程有了更深的了解。但对于编译器编译过程中的链接了解有着一定的缺陷需要在后期弥补。

对于在Linux终端系统编译C语言还不熟练,归根结底是因为对于文本框中的底行模式和插入模式命令不够熟悉,不能够及时的打出命令实现操作。同时对于终端系统中的命令也需要进一步的强化,为了之后编译的方便。

  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值