我的全栈之路-C语言基础之HelloWorld

混江龙づ霸主 提交于 2019-11-28 10:06:03

我的全栈之路-C语言基础之HelloWorld

3.1 Visual Studio 2019实现HelloWorld

  1. 新建解决方案
    在之前创建的Git仓库c-core-programming基础上新建项目
    新建解决方案
    然后选择项目模板:基于C++的空项目
    基于C++的空项目

然后设置项目名称、路径以及解决方案名称
配置新项目

  1. 新建筛选器
    在解决方案资源管理器视图下,选中源文件,然后新建筛选器

新建筛选器
新建筛选器

筛选器的名称为Chapter1

Chapter1
Chapter1

  1. 新建项
    新建源文件helloworld.c
    新建源文件helloworld.c

  2. 编辑源文件

#include <stdio.h>
#include<stdlib.h>

int main(int argc, char* argv[]) {
    printf("Windows10 1903 & Visual Studio 2019 Hello World \n");
    system("pause");
    return 0;
}
  1. 运行helloworld
    点击本地Windows调试器,可以运行程序,也可以通过快捷键F5启动本地Windows调试器来运行程序
    本地Windows调试器

程序运行结果
程序运行结果

如果想要关闭程序,可以通过快捷键Shift+F5实现。
如果运行程序时出现如下提示
在调试时停止自动关闭控制台

可以根据提示设置在调试时停止自动关闭控制台
在调试时停止自动关闭控制台

Visual Studio遇到printf()语句自动弹出终端输出Windows10 1903 & Visual Studio 2019 Hello World,遇到return语句关闭终端,打开终端和关闭终端时间很短,感觉程序有闪退现象。
这里可以调用stdlib.h头文件中的system函数并传递字符串参数pause让程序暂停。

  1. 推送代码到远程仓库
    首先切换到团队资源管理器视图下,然后点击更改
    更改
    然后填写提交信息,点击全部提交,此时会将代码提交到本地仓库
    commit log

然后点击同步到远程仓库
同步远程仓库

推送到远程仓库
推送到远程仓库

然后就可以在GitHub仓库中查看提交的内容
!c-core-programming

3.2 HelloWorld详解

3.2.1 #include预处理

在C语言中,如果想要调用系统的某个函数,必须首先包含该函数声明所在的头文件,例如hellowrld程序中调用printf()函数声明,就是位于系统目录C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt下的头文件stdio.h。

stdio.h
stdio.h

如果包含的文件在当前目录下,使用#include "头文件",如果该头文件在系统目录下,则使用#include <>。而编译器查找当前目录下的头文件时如果未找到,还会去系统目录下查找对应的头文件。

#include的本质就是将包含的头文件内容全部复制到源文件中去。
如何验证这一点呢?

首先在项目c-core-programming-foundational的头文件下新建筛选器Chapter1,并创建头文件guanglei.h

guanglei.h
guanglei.h

然后把之前源文件helloworld.c的源码复制到guanglei.h中

guanglei.h
guanglei.h

之后定义源文件guanglei.c

guanglei.c
guanglei.c

该源文件的内容只需要使用#include "guanglei.h" 即可运行。
guanglei.c

但是Visual Studio 2019 解决方案(例如c-core-programming)下每个项目(c-core-programming-foundational)只能有一个包含main方法的源程序,否则程序运行时会出错。
定义多个main方法会出差错

这里将之前helloworld程序中的main方法改成别的名字(例如helloworld_main)即可。

然后再次运行程序,运行结果和之前的helloworld程序结果一样

#include
#include

#include <stdio.h>表示包含头文件stdio.h,std表示标准库,是可以移植的。也就是helloworld.c可以运行在各个操作系统下。

Windows10 1903 &CLion 2019.2
Windows10 1903 &CLion 2019.2

Ubuntu18.04 & CLion 2019.2
运行之前必须先安装CMake,使用sudo apt install cmake安装即可

Ubuntu18.04 & CLion 2019.2
Ubuntu18.04 & CLion 2019.2

macOS10.14 &XCode10.3
macOS10.14 &XCode10.3

而stdio表示标准输入输出,printf()函数正是一个输出函数。
stdlib表示标准库,system()函数正是一个标准库函数。
头文件只存放了函数的定义,至于函数的实现,在对应的系统库文件中。
如果想要了解你的C程序依赖了哪些系统库,在Linux(Ubuntu)下可以使用ldd命令查看
ldd.png

3.2.2 main函数

main函数是C程序的入口,一个项目只能有一个main函数,否则程序运行时会提示定义多个main函数。
当程序运行时,系统自动调用main函数,程序从main函数的第一行开始执行,如果其他函数想要得到执行,那么必须被main函数直接或者间接调用

int helloworld_main(int argc, char* argv[]) {
    printf("Windows10 1903 & Visual Studio 2019 Hello World \n");
    system("pause");
    return 0;
}
  • main函数左边的int是函数的返回值,右边()的内容表示函数的参数,外部数据通过函数的参数传递到函数的内部处理。

  • {}表示函数的函数体,也就是函数执行的所有内容都包含在{}中,它是成对出现的。

  • printf函数是系统自带的函数,用于将""包含的字符串按照指定的格式输出到终端,终端可以是控制台、网页或者是文件,目前是输出到控制台。

  • \n表示换行,这里就是输出内容之后换行。

  • 分号(;)表示一条语句结束,C语言每条执行语句都需要以分号(;)结束,如果不加上分号会发生编译错误。

  • system("pause")表示程序暂停,输入任意键后退出,如果在Visual Studio中编写C程序必须加上system("pause"),否则程序运行完成后就直接退出。使用CLion、QT不需要加上system("pause")。

  • return 0表示将int类型的值返回给main函数的调用方(系统)并结束main函数,return语句之后的代码都不会再执行了,0表示正常结束。

在源文件function.c中定义了一个add方法,传递两个整数参数,返回两个整数相加的结果。并且该方法在主函数的prinf方法中被调用,用于输出两个整数相加的结果。
printf函数中的%d表示对应位置的参数按照整数输出。

#include <stdlib.h>



int add(int source,int target) {
    return source + target;
    printf("不可达代码\n");
}


int main(int argc,char* argv[]) {
    int source = 50;
    int target = 100;
    printf("%d加上%d的结果是%d\n",source,target,add(source,target));
    system("pause");
    return 0;
}

程序运行结果表明add方法的return语句之后的输出语句printf("不可达代码\n")并没有执行,如果想要add方法得到执行,在main方法中调用即可,调用时需要传递对应的参数。
return关键字

3.3.3 注释

注释是用于描述程序的功能,为了便于程序后期的维护,在开发过程中应该添加适量的注释,编译器在预编译时会删除注释,所以注释的内容不会影响程序的结果。

C语言中支持的注释包含单行注释(//)和多行注释(/**/)两种,单行注释顾名思义就是注释一行,多行注释可以注释多行,需要注意的是多行注释不能够嵌套使用,否则会发生编译错误。

增加单行注释和多行注释后的helloworld程序

#include <stdio.h> 
#include<stdlib.h>
/*

 我的第一个C程序
 @author liuguanglei ittmelinedotnet@gmail.com
 @version 2019/08/20

*/
int main(int argc, char* argv[]) {
    //快捷键F12可以查看函数定义  Ctrl+ -返回
    printf("Windows10 1903 & Visual Studio 2019 Hello World \n");
    system("pause");
    return 0;
}

3.4 Windows常用命令

3.4.1 Windows命令概述

主流的操作系统(Windows,Linux(Ubuntu),MacOS)及大多数应用程序都提供了基于命令行和图形化界面两种交互方式,而移动端是采用手势触控、语音等进行交互。作为普通用户来讲,图形化界面容易上手,而且交互效果更加直观。

但是作为一个程序员来讲,应该去熟悉各个操作系统的命令行的使用,因为命令行相对图形化界面而言,绝大多数场景下使用更加高效。而且图形化界面本质是对命令行的封装,能用图形化界面实现的基本都可以采用命令行实现。而且在服务器端(CentOS,RedHat)基本上是不会安装图形界面。

Windows下想要使用命令,必须首先启动控制台。

Windows系统可以使用快捷键Windows+r调出运行
enter description here
后输入cmd,便可以进入Windows下的命令行终端
enter description here

3.4.2 Windows常用命令

在启动Windows的终端(也称为控制台)之后,便可以运行命令了。

如果你使用Windows作为开发平台,如下的命令你也许会经常使用到。

命令名称 功能描述
dir 列出当前目录列表
cd 切换目录(只能在根盘符(例如C盘)内切换)
md 创建目录
del 删除文件
type 显示文本文件内容
echo 输出文本内容 例如echo %path% 查看系统环境变量
ping 检测网络,例如ping baidu.com
notepad 记事本
calc 计算器
mspaint 画图
explore 文件资源管理器
cleanmgr 磁盘清理
desk.cpl 分辨率设置
powercfg.cpl 电源设置
regedit 注册表编辑器
msconfig 系统配置
mstsc 远程连接
firewall.cpl 防火墙
appwiz.cpl 添加或修改程序
tasklist 查看进程列表
taskkill /f /im process-name.exe 关闭指定进程
netstat -ano|indstr "port" 查看端口占用
msinfo 系统信息
sticky notes 便签
ipconfig 查看ip
winver 查看windows版本
cls 清除屏幕内容
exit 退出终端

3.5 system函数的使用

system函数用于C程序中调用各大操作系统的命令和应用程序,被调用的命令和应用程序以字符串的方式作为system函数的参数传入。

实现读取用户输入的命令,并执行该命令

#include <stdio.h>
#include <stdlib.h>

/*
    使用system函数执行用户输入的命令
    @author tony ittimelinedotnet@gmail.com
    @version  2019/08/20
*/
int main(int argc,char* argv[]) {

    printf("请输入你要执行的命令\n");
    //定义数组保存用户输入的指令
    char str[100] = { 0 };
    //使用scanf_s函数读取用户输入的指令
    scanf_s("%s", str);
    //执行命令
    system(str);
    return 0;

}

因为system函数位于stdlib.h头文件中,意味着它是一个可以跨平台使用的函数,Visual Studio 2019中可以使用F12快捷键跳转到函数的定义。使用Ctrl+-快捷键实现后退。
但是各大操作系统的命令和应用程序是不相同的,例如在Windows上使用system函数传递字符串参数"notepad"时可以打开记事本,而移植到了类Unix上则无法调用记事本。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!