ps:如果各位有遇到什么经典问题,欢迎在下面评论区@我,我会进行补充,谢谢~

常识篇

指的是编程应该有的常识~

字符分类

字符

在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信息.

一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号、一个图形符号或者控制符号等.

字符集

不同的字符集包含的字符个数不一样、包含的字符不一样、对字符的编码方式也不一样.

常见的字符集有:

  • GB2312:中国国家标准的简体中文字符集.
  • ASCII:只包含了128个字符,主要为英文字符,阿拉伯数字和一些简单的控制字符.
  • GBK字符集.在GB2312的基础上添加了部分字符,就形成了GBK,完全兼容GB2312.
  • Unicode字符集.国际标准字符集,可以容纳一百多万个字符.

ASCII字符集

C语言代码仅使用ASCII字符集构成(不考虑字符串).

分成可见字符不可见字符,即一些控制字符和正常的英文字母,数字标点等可见字符.

其中空格' ',制表符'\t',换行符'\n',回车符'\n',虽然为可见字符,但是是空白字符.

scanf()函数的%s格式控制符在遇到空白字符时会停止.

软件篇

概念的分辨

IDE,编译器,编辑器并不是一个东西,不要混淆……

IDE:集成开发环境(Integrated Development Environment),指一类集成的软件了,不仅仅可以进行代码的编辑,一般还默认集成了某种(或多种)编译器进行代码编译,还包括了调试功能,甚至还会有代码仓库的管理,协同开发等高级功能,一般较为庞大,不过也有DevC++这样的小型IDE。

常见的IDE有Visual Studio(VS),CLion,Devc++,Xcode等等.他们有的是免费软件,但更多的是收费软件,具体见官方网址.

编译器:即特定编程语言的编译工具,用于将源代码转为可执行代码,编译器几乎都是方便易用的,而且几乎都是免费的,安装即用。C/C++常用编译器有这三种种:GCC(Linux下,windows移植于Mingw工具链)Clang/LLVMMSVC(微软家的编译器,VS系列IDE默认的编译器)

编辑器:就跟windows下的记事本一样的,敲代码用的,只不过像VScodeSublimetext3Notepad++这样的高级编辑器十分强大,内置了许多高级的编辑功能,而且往往可以通过安装扩展来支持各种其他功能,往往能直接配置编译器进行代码的编译运行,所以甚至可以被改造为一款IDE

IDE使用

VS配置C/C++环境并创建项目

  1. Win7系统,建议使用VS2017,Win10及Win11使用VS2022

  2. 安装的时候只在工作负荷选一个使用C++的桌面开发即可,其他设置默认无需改动

image-20231218000958855
  1. 创建项目注意一定是C++的,不要创建成C#项目
image-20231218000442912
  1. 配置项目名和路径,最好找一个目录,专门存每次的代码,例如D:\code\My_VS_Code\
image-20231218000630109
  1. VS编写C代码不能使用scanf等函数,解决方法见:

C语言教程-2-环境搭建

  1. 一个项目只对应一个程序,一个程序只能有一个main()入口,哪怕你在一个项目里开了一堆源文件,也只能保留一个main(),因为这些源文件属于一个程序,不理解请移步谷歌搜索C语言多文件编程
  2. 待补充

安全检查的问题

另外,要注意的一点就是,VS默认是进行C++的开发,所以你会发现后缀都是.cpp,你改成.c也可以.还有很重要的一点就是,msvc(或者说VS这个IDE)默认是不允许使用scanf等函数的,因为他认为这些函数并不安全(具体原因以后解释,涉及到越界/栈溢出的问题),所以转而要求你使用scanf_s等函数来代替,报错如图:

image-20230919192737049

报错是英文的:'scanf': This function or variable may be unsafe.,所以英语也要多少会一点,不至于连报错提示都看不懂.

但是,我想说一句话:

学习过程中你可以犯错,让编译器去迁就你,但是如果你要去因为一个编译器的特殊性,你要去迁就编译器,那你这学的就一塌糊涂

我们学C,首先要学的就是标准C,至少也得是ANSI C,不过2023年了,我们至少要学习C99的标准.

scanf_s等函数是在C11才出现的,目前各大编译器的支持度不高,而且scanf_s和scanf的使用方法也并不相同,所以,一句话,不要使用scanf_s.

注:解决的是错误,即使用scanf编译会报错,而警告scanf的返回值被忽略不仅仅是VS会警告,其他软件也会警告,这是一个良好的警告,但我们无需关心—scanf的返回值确实有用,但是简单的程序用不到.

那么为了在VS中正常使用scanf等函数,我们有三种解决办法:

方法1:

关闭SDL检查

SDL(Security Development Lifecycle),安全开发生命周期检查,微软在VS2012新推出的东西,为了能更好的监管开发者的代码安全,如果勾选了这一项则将严格按照SDL的规则编译代码,会有一些以前常用的函数无法通过编译。

我们只需要把项目的SDL检查关闭即可,注意:每次新建项目都需要进行处理,包括下面的其他方法!

在菜单栏依次点击 项目->[你的项目名]属性,打开属性窗口,再次点击 配置属性->C/C+±>常规->SDL检查:

image-20230928163054328

将SDL检查从修改为即可.

方法2:

为项目添加_CRT_SECURE_NO_DEPRECATE预处理器定义

在菜单栏依次点击 项目->[你的项目名]属性,打开属性窗口,再次点击 配置属性->C/C+±>预处理器->预处理器定义:

image-20230919192447314

在结尾先添加一个; ,然后输入_CRT_SECURE_NO_DEPRECATE这一段,点击保存,这时,回到你的包含scanf的程序,再次运行,即可正常:

image-20230919193040954

方法3:

在每个源文件开头添加一行代码:#define _CRT_SECURE_NO_WARNINGS 1即可:

image-20230919193744735

到此为止,VS2022的基本安装结束,以后遇到任何问题,请不要吝惜你的浏览器,先去网上找解决方案,一搜一大把.

程序无法写入的问题

有时候会发生编译时无法对程序写入的错误,这是因为上次调试的进程未正确关闭,程序句柄仍在占用,导致拒绝写入目标程序:
image.png|725

解决办法是在任务管理器中杀死对应程序。
例如上图中的程序名为 Project1.exe ,按下 ctrl+shift+esc 打开任务管理器,搜索 Project1 然后将对应进程结束即可:
image.png|600

编译器使用

gcc/g++编译

高级文本编辑器配置

VSCode配置C/C++的基本编译/运行调试环境

注:本节可以参考 C语言教程-2-环境搭建

首先,刚接触C的新手建议离开,一定程度上熟悉了编程的萌新可以逝逝.

VScode的项目设置由目录下的.vscode中的json配置文件控制,我们需要配置3个文件:

c_cpp_properties.json,tasks.json,launch.json

c_cpp_properties.json为C/C++语言相关的一些配置参数;

tasks.json为任务配置文件,其中的每一个子项就是一个任务,我们可以将各种编译任务在这里配置.

launch.json为启动配置文件,用于启动编译后的程序,进行运行或调试;

c_cpp_properties.json

使用这个配置文件对C/C++源文件进行编译选项和环境的配置.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"configurations": [
{
"name": "Win32", // 表示这个配置项是为 Win32 平台准备的
"includePath": [ // 指定了用于查找头文件的目录
"${workspaceFolder}/**" // 将会包含工作区文件夹下的所有子目录
],
"defines": [ // 定义宏的数组,这些宏将在编译过程中生效
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0", // 指定 Windows SDK 版本的配置项
"compilerPath": "<path>/mingw64/bin/g++.exe", // 指定编译器路径的配置项,指定了g++编译器的完整路径,这里的<path>是你的mingw安装路径
"cStandard": "c17", // 指定C17标准
"cppStandard": "c++17", // 指定C++17标准
"intelliSenseMode": "windows-gcc-x64" // 使用 Windows 平台上的 GCC 编译器进行 IntelliSense 代码补全和语法检查
}
],
"version": 4
}

tasks.json

这个文件配置了各种任务,我们进行编译操作的配置.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
{
"version": "2.0.0",
"tasks": [ // 该列表的每一项都是一个任务
{
"type": "cppbuild", // 类型
"label": "C++ Build", // 重要,任务名
"command": "<path>/mingw64/bin/g++.exe", // 调用g++对C++进行编译
"args": [ // 命令行参数
"-fdiagnostics-color=always",
"-g",
"${file}",
"-std=c++11", // C++11标准
"-o",
"${fileDirname}/${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "<path>/mingw64/bin"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "使用 g++ 进行c++单个文件的编译"
},
{
"type": "cppbuild",
"label": "C Build",
"command": "<path>/mingw64/bin/gcc.exe", // 调用gcc对C进行编译
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-std=c11", // C11标准
"-o",
"${fileDirname}/${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "<path>/mingw64/bin"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "使用 gcc 进行c语言单个文件的编译"
},
{
"type": "cppbuild",
"label": "c/c++ debug", // 这个任务专门用于调试
"command": "<path>/mingw64/bin/g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "<path>/mingw64/bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
]
}

launch.json

这里是启动配置,这里配置了调试的配置信息.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++ debug", // 启动配置的名称
"type": "cppdbg", // C++的debug
"request": "launch",
// inner shell
"program": "${fileDirname}//${fileBasenameNoExtension}.exe", // 启动对应的程序
"args": [],
// 这里可以用于在外部运行
// outer shell
// "program": "C://Windows//System32//cmd.exe",
// "args": [
// "/c",
// "${fileDirname}//${fileBasenameNoExtension}.exe",
// "&",
// "echo.",
// "&",
// "pause",
// ],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false, //设置是否启动外部控制台
// "avoidWindowsConsoleRedirection": true,
"MIMode": "gdb",
"miDebuggerPath": "<path>/mingw64/bin/gdb.exe", // gdb调试器的路径
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "c/c++ debug" // 十分重要,在启动前需要运行的任务,该任务参见前面的task.json中的对应任务,即在启动调试前先进行编译
}
]
}

代码篇

输出中文乱码

以"小熊猫C++"IDE为例.

image-20231226153023590

检查右下角是否为UTF-8编码,如果是,则需要转换为ANSI编码:

image-20231226153513381

其他软件类似,这种问题就是GBKUTF-8编码不兼容的问题.

Windows默认GBK编码,因此兼容性不佳(一般都是用UTF-8编码比较常见).

输入输出

字符串操作

栈溢出与安全问题

风格篇

代码格式化



---WAHAHA