相同点:都可以实现“暂停”效果 但实际过程,有区别。 getchar()是从输入缓冲区中读取一个字符。如果输入缓冲区(使用scanf输入的任何数据都是先被保存在输入缓冲区中!)中没有任何数据,那么就暂停,直到用户输入任意数据并回车,程序才继续往下执行。使用getchar()时,如果输入缓冲区中还有数据,那么就不能实现暂停效果。 system(“pause”)则与输入缓冲区没有任何关系,会直接暂停程序的执行,直到用户按下任意一个按键(不需要在最后输入回车符),才会继续执行。system(“pause”)还会有自动输出提示信息:“请按任意键继续. . .”而且这个提示信息是固定的,不能修改。 如果在程序中使用了某个c语言预定了的函数,比如printf, 就需要把这个函数的“函数声明”(相当于函数的“介绍”)包含到这个文件中。而这些函数的声明都已经存放在对应的头文件中,比如printf函数的函数声明在stdio.h, 所以需要在程序中使用 #include <stdio.h> 在实际开发中,也会常常定义自己的头文件,用来保存一些函数的函数声明,其他文件如果想使用这些函数,就包含这个头文件。具体用法在项目实战环节再详细介绍。 作用1:作为函数的返回类型 函数的返回类型为void, 就表示这个函数没有返回值。 作用2:作为函数的参数 函数后面的()用来写参数,如果没有参数,建议写void, 告诉编译器,这个函数没有参数。如果不谢,编译器也会认为没有参数。但是可能会告警,因为编译器怕你忘记写参数了,如果写void, 就是明确告诉编译器,这个函数时没有参数的。 作用3: 作为void*, 表示指向任意类型的指针,在指针部分详细介绍。 实际项目中,会很多函数,大项目中有几千甚至几万个函数。main函数是程序的入口,也就是程序运行时,首先从main函数开始执行 变量的存储位置 当程序员定义一个变量比如, char x; 变量的含义: 学习编程,有一个捷径,就是不要去纠结什么语法知识。而是从解决问题入手。 程序的目的就是为了解决问题的. 如果程序写对了,但是解决不来问题,那这个程序也就是没有任何意义的。 比如拥有一个问题,需要计算两个数的和,也就是做加法。 需要你来设计一个程序,来实现这个加法功能。 那么你就需要使用某个东西,来保存用户输入的两个整数。 用什么来保存呢? 使用“变量”! 需要定义几个变量呢? 至少要定义3个。 分别用来保存用户输入的两个整数,以及他们的和。 int a; int b; int s; //计算的结果。 printf 就是向屏幕打印信息 fprintf是向指定的文件打印信息。而一般的文件,都是保存在磁盘的,也就是硬盘。比如文件 C:/tmp/hello.c printf其实是fprintf的一种特殊情况,就是把信息打印到一个特殊的文件(标准输出设备),而默认的标注输出设备就是屏幕(控制台的屏幕) gets和fgets也是类似的。 比如每个星期有7天,你准备每天都要去跑步锻炼,计划每天跑步的运动量。 假设: 星期日:3000米, 星期1:5000米 星期2:4000米 星期3:3000米 星期4:1000米 星期5:2000米 星期6:8000米 此时就可以定义一个数组: int run[7] = {3000, 5000, 4000, 3000, 1000, 2000, 8000}; 这个数组的数组名称是run, 包含7个整数。第一个整数用run[0]表示, 最有一个数组用run[6]表示。 这7个整数连续存储在内存中,第一个run[0]的存储地址最小,run[1]紧跟着存储在run[0]后面。 run包含7个成员,每个成员都是一个整数,每个整数占用4个字节,所以run一共占用 4*7=28个字节。所以: sizeof(run) == 28 任何if判断语句,都要满足条件为真,才执行 这里的条件为真,不是说其中某个变量的值是真是假,而是指整个表达式的值是否为真。 比如,file的值为NULL(也就是0, 就是假) if (file) { //不会执行 } if (file == NULL) { // 虽然file是假,但是 file == NULL 就是真! ///会执行 } 普通表达式和真假没有关系 但是所有比较运算的结果,都是逻辑镇,也就是真或者假 rn是属于文件的格式问题。 当把回车符(n) 保存为rn时,这个回车符,在文件中实际占用两个字节,分别为’r’ ‘n’。 所以:字符串 “123n”在文件中占用5个字节, 即保存为”123rn”, (注意,字符串结束符 ,仅在c语言中使用,用来表示字符串的结束,在文件中是没有字符串结束符的,除非特别的去写入这个字符) 如果系统是windows7或者windowsXP, 按照这个视频来做,建议一边看一边做: 如果系统是windows10, 按照这个视频来做,建议一边看一边做:(群文件里有) 软件MinGW到群里直接下载: 我们在使用scanf或者getchar或者gets收入数据时,从键盘输入的数据,都是先进入”输入缓冲区“。 scanf先在输入缓冲区中检查时候有数据,如果输入缓冲区中有数据,就直接从输入缓冲区中读取数据。 如果输入缓冲区中是空的,程序就会暂停,等待用户输入数据。 比如:scanf(“%c”, &x); 如果输入abc和回车, 但是实际只读一个字符,所以输入缓冲区中还会剩下 ‘a’ , ‘b’ 和 ‘n’ 如果后面还有一个输入语句: scanf(“%c”, &y); 或者 y = getchar(); 此时就直接从输入缓冲区中读取一个字符 ‘b’, 用户就没有机会输入数据了。 或者右面还有一个输入语句: scanf((“%d”, &y); 此时直接从输入缓冲区中读取一个整数,但是输入缓冲区中是’a’和’b’, 并不是整数,导致用户没有机会输入数据,而去把’a’和’b’当整数输入,结果当然是输入失败。 如果输入缓冲区中还剩下数据,就导致后面的scanf或者getchar语句执行时,程序不会暂停让用户输入,而是直接从输入缓冲区中获取数据。 如果输入缓冲区中还有回车符,就会导致后面的gets语句执行时,程序不会暂停让用户输入,而是直接从输入缓冲区中读取一个空行!(就是一个空字符串),因为 gets是遇到回车符符就结束。 为了解决这个问题,就可以使用 fflush(stdin); fflush(stdin) 就会把输入缓冲区的所有数据都清空。 使得后面的scanf或者getchar能够暂停,让用户重新输入新的数据。 补充:scanf语句中使用 %d 或者 %f 或者 %lf时, 或自动跳过 空格,回车符,和制表符。 我们编写的源程序,比如 hello.c 这些程序其实是给人看的,计算机并不懂,计算机也不能执行 hello.c 当在cmd窗口中, 执行这个a.exe文件时, 会把硬盘中的a.exe文件 复制到内存中执行! a.exe在内存中执行的过程中, 如果从文件user.txt读取一个字符串,并保存到数组中时, 那么此时会在数组中的字符串最后加一个字符串传结束符 getc和fgetc的作用是一样的。 getc其实是一个宏,宏的具体用法在后面会详细介绍。 getc的定义如下: 也就是说,代码中如果有 getc(file), 在一般的使用场合中,使用 getc和fgetc的效果是一样的 这个是我的误操作了, 应该使用fclose 对于如下文本: 张三丰 Tel:13507318888 Addr:武当 刘备 Tel:13802289999 Addr:成都 马云 Tel:13904256666 Addr:杭州 马化腾 Tel:13107551111 Addr:深圳 可以循环使用如下代码读取: fscanf(file, “%s Tel:%s Addr:%sn”, name, tel, addr); 但是不加回车符,使用如下语句也能读取: fscanf(file, “%s Tel:%s Addr:%s”, name, tel, addr); 这是是因为: 使用fscanf(file,”%s Tel:%s Addr:%s”,name_tmp,tel,addr),匹配到第一行的第2个%s时,刚好把第一个行中,除了最后的回车符以外,匹配完。此时第一行还剩下一个回车符。接着进入第2轮循环,又开始使用scanf匹配,但是注意,是从文件的上一次匹配结束的位置继续匹配,也就是第一行行尾的回车符为止,在这个格式字符串中,第一个是%s,所以会跳过第一行行尾的回车符,从而匹配成功。 如果文件的内容是这样的格式,就必须在格式字符串的最后加上n了 姓名:张三丰 电话:13243879188 姓名:张四风 电话:13243879199 总结:需要特别注意fscanf的格式字符串中最后的n的作用。 然后重新创建一个文件,就默认是ANSI编码了,在cmd就可以正常输出中文了 vs乱码: 如果控制台的编码和程序的编码一致,还是有中文乱码,就需要修改控制台的属性, 右击控制台标题栏,选择“属性”,勾选“使用旧版控制台” 然后再重新运行。 scanf的返回值,表示成功输入的数据个数。 例如: int x; scanf(“%d”, &x); 当输入100时,x的值是100 如果输入a, 那么将导致scanf执行失败,此时x的值还是原来的值,而x没有设置初始值,所以将是一个不确定的值,一般会是一个很大的值。 如果要考虑合法性,可以使用: int x; int ret; ret = scanf(“%d”, &x); if (ret <= 0) { printf(“输入错误”); exit(1); } scanf的返回值,表示成功输入的数据个数。 <=表示小于或者等于, 5 < 6 是真 5 < 5 是假 5 <= 6 是真 5 <=6 就相当于: 5 < 6 || 5==6 根据实际需求使用,可以随时使用< 或 <= 比如, 需要循环10次,可以使用 for (int i=0; i<10; i++) 也可以使用 for (int i=0; i<=9; i++) 这样问,说明还没有理解结构体的含义。 那么如果有如下两个结构体变量: 那么s1中含有name成员 如果只用name来表示,就无法区别是s1的name还是s2的name 结构体,本质上是一种“数据类型”,和int类型、char类型同等地位! https://jingyan.baidu.com/article/6b182309976683ba58e159c3.html vs认为scanf, f_open等函数不安全,编译时,会出现如上4996警告。 方法1:修改项目的项目属性 方法2: 在出现问题的文件中的头文件后面,添加: #pragma warning(disable:4996) 安装: break使用的场合比较多,在while语句,for语句,switch语句,都可以使用。 在while语句和for语句中,break的作用,就是直接结束结束循环,跳转到该循环语句之后的语句执行。在多重嵌套循环中,break只能跳出所在那一层循环。 在switch语句中,break的作用,就是直接结束switch语句,跳转到switch后面的语句执行。 continue语句,在while语句,for语句中都可以使用。 特别注意的是,在for循环中,如果遇到了continue语句,还是会先执行for语句中第3个表达式,然后再判断第2个表达式。 30. 逗号表达式 方法一:把scanf改为scanf_s;. 方法二:无需在程序最前面加那行代码,只需在新建项目时取消勾选“SDL检查”即可; 方法三:若项目已建立好,在项目属性里关闭SDL也行; windowsXP配置方式 再单击确定。 windows10: 或者: 需要重启系统,然后按一个快捷键(不同的电脑,按键不同,可以搜索“自己的电脑型号 进入BIOS”),进入BIOS 然后在BIOS界面中,找到一个 virtualization相关的一个选项,设置为Enable, 然后按F10退出重启即可。 如果程序文件名是 hello.c 那么编译时使用:gcc hello.c 得到的可执行文件就是 a.exe 如果再使用: gcc test.c 得到的可执行文件 a.exe就会覆盖原来的a.exe 可以使用 -o选项来指定生成的可执行文件名 例如: gcc hello.c -o myHello 得到的可执行文件的文件名是 myHello gcc test.c -o myTest 得到的可执行文件的文件名是 myTest -o后面可以使用任意名称。 变量的定义,比如 int s = 0; 或 int s; 如果这个变量的定义放在某个 { }内,那么这个变量只能在这个大括号内生存,也就是说,只能在这个大括号有效 比如,如果你的某个同班同学叫马云,那么在这个班里,凡是说马云的,都是说班上的这个同学。 出了班级,在学校里或者在社会上,凡是说马云的,就是阿里巴巴的马云。 例如: (表达式1, 表达式2, 表达方式3, … , 表达式n) 当用()把多个表达式括起来,中间用逗号隔开时, 一起构成一个整体,称为逗号表达式. 整个逗号表达式的值, 是()中最右边一个表达式的值. 比如(3, 5, 8)的值是8, (1+2, 2+5, 3+4)的值是 3+4, 也就是7 36. 42 类的定义中初始化数据成员 在类的定义中,直接对数据成员初始化,在老标准的C++中是不支持这样做的。 但是在C++11中,是支持这种写法的! vs2010, 只支持少部分c++11特性,大部分C++11的新特性都不支持。 在类的定义中,直接对数据成员初始化,在vs2010中也是不支持的,但是在vs2015或者更高的版本中支持。 解决方案: https://jingyan.baidu.com/article/851fbc3797531e3e1f15abea.html?qq-pf-to=pcqq.group for( int i=0; i<10; i++) { // } 这种方式(在for循环的第一行中的第一个分号之前,定义变量)在老版本的C语言中,是不支持的。在C++中是支持的。 新版本(C99版本)支持, 在编译时,最后加一个 -std=c99 来指定编译版本。 比如: gcc hello.c -std=c99 然后在该邮箱中,打开邮件中的重置链接。 如果重置失败,就只有重新注册一个新账号。 305 按%c输出, 就是按照char类型输出 //scanf_s(“%s”, x, ); //在vc++中正确,在vs中错误 scanf_s(“%s”, x, sizeof(x)); //正确 scanf_s中,最好再加上一个参数,从来最多接收多少个字节的数据。 在vc++(vs的c++版本)中,不需要第3个参数来表示最大数据长度 在vs中,必须要使用第3个参数来表示最大数据长度 scanf_s(“%s”, x, sizeof(x)); 在vc++中,输入ctrl+z 回车 scanf_s就返回EOF(-1) 在vs中,连续输入两次或三次ctrl+z 回车, scanf_s才返回EOF(-1) Github只是一个提供存储空间的服务器,用来存储git仓库 Github已经成为了管理软件开发以及发现已有代码的首选方法 Github公有仓库免费,私有仓库要收费 你可以参与别人的开源项目,也可以让别人参与你的开源项目 提示: VS2010 “缺少dlmgr.dll 无法继续执行代码。重新安装程序可能会解决此问题 64位系统: 把平台工具集,改为v100 一些入门的视频教程和小游戏项目的教程都在B站上 整理不易,点个赞吧~~~如果想和我一起学习,请关注我或者私信我,我会给大家准备一套免费的C/C++学习资料技术交流群:782648055
1. getchar和system(“pause”)2. 头文件的作用
3. void
4. main函数
5. 变量
这个变量x占用一个字节,但是这个变量的具体存储位置,是编译器来决定的,程序员不能决定。但是程序员可以使用 &x来获得变量x的存储地址。6. printf和fprintf
7. gets和fgets
gets是从键盘读取一行字符串。
fgets是从指定的文件读取一行字符串。
gets是fgets的一种特殊情况,就是向一个特殊的文件读取,这个特殊的文件就是标准输入设备,而默认的标准输入设备就是键盘。8. 数组的理解
9. 编译报错-implicit declaration
10. if的条件判断
11. 逻辑值
1+2 和真假无关
strcmp(name1, name2)和真假无关,这个函数的值就是一个整数。
比如:
1+2 == 3 结果是 真
strcmp(name1,name2) == 0 结果是真或者假
1+2 > 3 结果是假12. fscanf
13. 回车符
当使用fgets读取这个文件时,会把文件中的’r’ ‘n’ 这两个字节,识别为一个字符 ‘n’
但是再使用fgets读取这一行时,读到的只是 “123n”, 也就是把rn识别为一个字符n, 另外在最后加上一个字符串结束符 14. gcc没有安装
15. 输入缓冲区
只有%c , 不会跳过任何字符。16. 字符串结束符
需要使用编译器(比如gcc) 把这个程序hello.c转换为计算机能够识别的可执行文件(.exe文件)
比如: gcc hello.c
就会把hello.c 转换为 可执行文件 a.exe
这个a.exe文件此时还是保存在硬盘里。17. getc和fgetc
#define getc(fp) fgetc(fp)
就会把它替换成:fgetc(file)18. close和fclose
fclose是C语言的接口
close也是关闭文件的作用,但是 close是系统级的接口,也就是说,比fclose更底层,更接近操作系统的函数。19. fscanf的多行匹配
20. notepad++/vs乱码
21. scanf的返回值
22. <或<=
23. 结构体的含义
结构体变量,包含多个子变量。
比如已经定义了结构体 struct student类型。
这个结构体类型中,含有name成员(一个字符数组)
struct studen s1;
struct student s2;
s2中也含有name成员
结构体,不是一个变量!
使用结构体,可以定义任何多个这种结构体类型的变量。24. 弹出窗口
#include <windows.h> #include <stdio.h> int main() { int ret; ret = MessageBox(NULL,"我爱你!","",MB_OKCANCEL|MB_SETFOREGROUND); if (ret == 1) { MessageBox(NULL,"我再想想..","", MB_OK|MB_SETFOREGROUND); } else if (ret == 2) { MessageBox(NULL,"开玩笑的","",MB_OK|MB_SETFOREGROUND); } return 0; }
25. 远程后不能控制系统
26. 4996错误
关闭VS警告 warning C4996
27. TeamViewer的使用
28. break和continue的作用
在while或for语句中,如果遇到continue语句,就直接结束本次循环,进入下一轮循环的判定语句。29. strlen
#include <stdio.h> int main(void){ int x,y; //先计算x=10 x = 10, 11, 12; //(10,11,12)这个逗号表达式的值的12,最后执行赋值运算 y = (10,11,12); printf("x=%dn", x); printf("y=%dn", y); return 0; }
31. vs不能使用scanf等函数
32. scanf,fscanf 读字符串
33. strcmp
34. 扩展名
35. 密码输入
#include<conio.h> #include<stdio.h> int main(void) { char pwd[32]; int ch; int i = 0; while (1) { ch = getch(); if (ch == 'r') { break; } pwd[i] = ch; i++; putch('*'); } pwd[i] = 0; printf("n您输入的密码是:%sn", pwd); return 0; }
void input_pwd(char *pwd, int max_len) { char c; int i = 0; printf("Please input pwd: "); while (1) { c = getch(); // getch不从输入缓冲区中读取 //在getch中,把回车按键输入,识别为回车符'r' //在getchar中,把回车按键输入,识别为换行符'n' if (c == 'r' || i >= max_len) { pwd[i] = 0; break; } pwd[i++] = c; printf("*", c); } }
36 虚拟机打开失败
37 可执行文件名同名
38 变量的作用域
{ int s = 0; { int s = 10; printf("s=%dn", x); //打印s=10, 如果小范围的某个变量,如果和外面的某个变量同名,那么在这个小范围内,都认为是小范围的变量 } printf("s=%dn", x); //打印s=0 }
39 循环体内变量的初始化
#include <stdio.h> int main(void) { int i; for (i=0; i<10; i++) { int s = 0; s += 1; printf("s=%dn", s); //始终打印s=1 } return 0; }
40 逗号表达式
41 loadimage出错
43 丢失api-ms-win-crt-conio-|1-1-0.dll
44 for循环不支持
45代码战争忘记密码
46. 305输出1
char只有1个字节,而305需要2个字节才能表示,所以就只取最低字节
也就是305, 最低字节是 305-256 = 49
而49按%c输出,就是输出ASCII值为49的字符, 就是字符1
所以输出147. scanf_s错误
48. 不显示行号
49. vs2010安装失败
复制dll文件到C:WindowsSystem32
复制dll文件到C:WindowsSysWOW64
32位系统:
复制xdll到C:WindowsSystem3250. vc++错误:VS2010 error MSB8008: 指定的平台工具集(v140)未安装或无效.请确保选择受支持的 Platforom
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算